C 以某种方式显示输出

C 以某种方式显示输出,c,C,我试图打印出文本文件中所有字符的ASCII值 int main(int argc, char* argv[]) { FILE *fp; int c; fp = fopen(argv[1], "r"); while((c = fgetc(fp)) != EOF) { printf("%c %3d\n", c, (int)c); } fclose(fp);

我试图打印出文本文件中所有字符的ASCII值

int main(int argc, char* argv[]) {
        FILE *fp;
        int c;
        fp = fopen(argv[1], "r");
        while((c = fgetc(fp)) != EOF) {
                printf("%c %3d\n", c, (int)c);
        }
        fclose(fp);
        return 0;
}
是否可以如下所示显示输出

r     a     n     d     o     m
114   97   110   100   111   109

假设输入文件中的第一个单词是“random”。感谢

您可以首先使用缓冲区在一行中记录输入,然后通过将缓冲区中的字符转换为下一行中的整数来显示输入的ASCII值

是的,正如我所说的,这是很有可能的。问“如何”是一个更好的问题。我想这就是你的意思

下面是一个示例,说明您可以如何进行此操作:

#include <stdio.h>
#define NEW_TERMINAL_LINE 10

void print_current_characters(char char_equivalents[]);

int main(int argc, char const *argv[]) {
  char char_equivalents[NEW_TERMINAL_LINE] = {0};

  int c;
  int i = 0;
  int final_position; /* Store the final position that we will use later
                       * to get the remaining characters in the buffer */

  FILE *file;
  file = fopen("file.txt", "r");
  if (file) {
    while ((c = getc(file)) != EOF) {
        if (i > NEW_TERMINAL_LINE - 1) {
          /* Every time the buffer fills up, we need to go to a new line
           * in the output as well (defined by NEW_TERMINAL_LINE).
           * Then we need to clear the buffer and make a new line 
           * to start off printing again!
          */
          print_current_characters(char_equivalents);
          int j;
          for (j = 0; j < sizeof(char_equivalents)/sizeof(char_equivalents[0]); j++) {
            char_equivalents[j] = 0; /* Clear the filled up buffer */
            i = 0;
          }
          printf("\n\n");
        }
        /* Print the character itself (we will print the ASCII when the buffer fills up) */
        char_equivalents[i] = c;
        if(char_equivalents[i] == '\n') {
          printf("\\n\t");
        } else if (char_equivalents[i] == '\t') {
          printf("\\t\t");
        } else if (char_equivalents[i] == ' ') {
          printf("[space]\t");
        } else {
          printf("%c\t", c);
        }
        final_position = i;
        i++;
    }

    /* Print any remaining characters in the buffer */
    print_current_characters(char_equivalents);

    fclose(file);
  }
  printf("\n");
  return 0;
}
void print_current_characters(char char_equivalents[]) {
  printf("\n");
  int i;

  for(i = 0; i < NEW_TERMINAL_LINE; i++) {
    if (char_equivalents[i] == 0 || NULL) {
      break; /* Don't print if there is nothing but 0s in the buffer */
    }
    if(char_equivalents[i] == '\n') {
      printf("\\n\t\t");
    } else if (char_equivalents[i] == '\t') {
      printf("\\t\t");
    } else {
      printf("%d\t", (int)char_equivalents[i]); /* Print the ASCII character */
    }
  }
}
如果
NEW\u TERMINAL\u LINE
设置为
10

  • 我们最终将ASCII等价物存储在名为
    char\u equivalents
    的数组中。对于我们遇到的每个字符,我们将其存储在数组中,然后打印出来,后面是一个制表符

  • 一旦缓冲区数组已满,我们向下移动一行,在数组中循环,并用格式输出ASCII值:

    由于
    char
    s本质上是伪装成ASCII的
    int
    s,我们只需将
    char
    键入
    int
    。这将打印出相应的ASCII值。之后,我们添加一个选项卡,以确保所有内容都与上面的行对齐。有了这些信息,就不难遍历数组并打印出相应的信息

  • >P>我们最终重置缓冲区,并打印在代码< > NeXiTealAlxLy[< /Cord]字符后面看到的空白新行。为了清楚起见,

  • 缓冲区被填充并重置,直到我们打印了文件中的所有字符(前面的步骤重复)

  • 最后,有时缓冲区未满,因此我们从未打印出输出中最后一行的剩余ASCII等价物。我们只需再次调用
    print\u current\u characters()



  • 1我真的不认为这是格式化代码的最佳方式,但同时,我确实希望遵守要求的格式。

    如果您处理单个单词而不是每个字符,将会更加方便。这样,您可以先打印单词的每个单独字符,然后打印每个字符的ASCII值,然后再打印下一个单词

    你可以试试这样的

    int main(int argc, char* argv[]) {
        FILE *fp;
        int c;
        char line[100];  /* Buffer to hold each line */
        fp = fopen(argv[1], "r");
        /* get each line, and print each word of the line */
        while (fgets(line, 100, fp) != NULL) {
                line[strlen(line) - 1] = '\0';
                print_words(line);
        }
        fclose(fp);
        return 0;
    }
    
    /* print_words: print each word from line */
    void print_words(char *line)
    {
        char *word;
    
        /* get each word, and print them with ascii values */
        if ((word = strtok(line, " ")) != NULL)
                ascii_print(word);
        while ((word = strtok(NULL, " ")) != NULL)
                ascii_print(word);
    }
    
    /* ascii_print: print each char and its ascii values for a word*/
    void ascii_print(char *word)
    {
        int i, len;
    
        len = strlen(word);
    
        /* print the word */
        for(i = 0; i < len; i++)
                printf("%-4c", word[i]);
        printf("\n");
    
        /* print ascii values */
        for(i = 0; i < len; i++)
                printf("%-4d", word[i]);
        printf("\n");
    }
    
    intmain(intargc,char*argv[]){
    文件*fp;
    INTC;
    字符行[100];/*用于保存每行的缓冲区*/
    fp=fopen(argv[1],“r”);
    /*获取每一行,并打印该行的每个单词*/
    while(fgets(第100行,fp)!=NULL){
    行[strlen(行)-1]='\0';
    打印文字(行);
    }
    fclose(fp);
    返回0;
    }
    /*打印单词:打印行中的每个单词*/
    无效打印字(字符*行)
    {
    字符*字;
    /*获取每个单词,并使用ascii值打印它们*/
    如果((字=strtok(行,“”)!=NULL)
    ascii_打印(word);
    while((word=strtok(NULL,“”)!=NULL)
    ascii_打印(word);
    }
    /*ascii_打印:打印单词的每个字符及其ascii值*/
    无效ascii_打印(字符*字)
    {
    int i,len;
    len=strlen(单词);
    /*打印单词*/
    对于(i=0;i

    请注意,上述程序并非完全正确,在某些测试用例中可能会产生错误结果。然而,这表明,如果你逐字处理,而不是逐字处理,会更容易

    虽然代码很简单,但如果您不熟悉,可能必须查看
    fgets()
    strok()
    的手册页


    简单地说,
    fgets()
    从文件中获取一行
    ,而
    strtok()
    从一行中获取每个
    单词。要了解更多信息,您需要在Google中执行
    man 3 strtok
    man 3 fgets
    (如果使用类似Unix的机器,则在命令行中执行)。

    是的,这是可能的。到目前为止,您尝试了什么,为什么不起作用?您想要多少个字符?您真的想要如图所示的间距,在第二行的数字序列之间有3个空格,并且除了第一行的第一个字符以外的所有字符都在第二个数字上对齐吗?为什么布局不规则?控制字符如换行符和制表符(其中一些有一位数的值)会发生什么情况?代码应该假设输出行有多宽?您的输出格式不清晰,未指定。我假设输入文件最多有1000个字符。我需要字符下面的ASCII值以可读的形式。那么,您希望在两个可能非常长的输出行上显示多达1000个字符的输入吗?这是可行的;目前尚不清楚这是否可取。您还没有回答我的其他问题(事实上,文件大小不是问题)。您的代码将如何处理文件中的换行符或制表符?当文件包含24个字符时会发生什么?我认为第二个循环将打印太多数据。@JonathanLeffler我想我可以编辑和处理换行符或制表符的特殊情况。我确实提到了
    MAX\u CHAR\u LINE\u LEN
    当然是一个限制,但是将缓冲区增加到100/更合理的数量同样容易。我担心的是,如果输入中有24个字符,那么第一行的字符长度将为20个,因此在处理最后4个字符时,第二个循环将安静地再次打印20个字符——文件的最后4个字符和前一行的16个字符。您需要将第二个循环限制为这次读入缓冲区的字符数(而不是缓冲区大小和字符非零)。打印控制字符可能会破坏布局,但你可以用“问题d”来为自己辩护
    int main(int argc, char* argv[]) {
        FILE *fp;
        int c;
        char line[100];  /* Buffer to hold each line */
        fp = fopen(argv[1], "r");
        /* get each line, and print each word of the line */
        while (fgets(line, 100, fp) != NULL) {
                line[strlen(line) - 1] = '\0';
                print_words(line);
        }
        fclose(fp);
        return 0;
    }
    
    /* print_words: print each word from line */
    void print_words(char *line)
    {
        char *word;
    
        /* get each word, and print them with ascii values */
        if ((word = strtok(line, " ")) != NULL)
                ascii_print(word);
        while ((word = strtok(NULL, " ")) != NULL)
                ascii_print(word);
    }
    
    /* ascii_print: print each char and its ascii values for a word*/
    void ascii_print(char *word)
    {
        int i, len;
    
        len = strlen(word);
    
        /* print the word */
        for(i = 0; i < len; i++)
                printf("%-4c", word[i]);
        printf("\n");
    
        /* print ascii values */
        for(i = 0; i < len; i++)
                printf("%-4d", word[i]);
        printf("\n");
    }