【问题标题】:Detect end of line in C检测C中的行尾
【发布时间】:2014-05-09 09:54:37
【问题描述】:

这是从文件“F1.txt”中读取 10x10 矩阵的代码

#include <stdio.h>

int main( int argc, char ** argv ) {

    FILE * fr;
    fr = fopen("F1.txt","r");

    int i, j;
    int matrix[10][10] = {0.0}; 

    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 10; j++)
        {
            fscanf(fr, "%d",&matrix[i][j]);
            printf("%d\n", matrix[i][j]);
        }
    }

    getchar();
    return 0;
}

“F1.txt”看起来像这样:

12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 4 34 56 43 32 124 52 212 3
32 343 34 544 43 32 7 52 456 98

它可以正常工作,但输出是:

12
343
34
544
43
32
124
52
212
3
12
343
34
544
43
32
124
52
212
..........
etc....

我必须检测行尾以使我的输入与 F1.txt 中的输入相同

12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 343 34 544 43 32 124 52 212 3
12 4 34 56 43 32 124 52 212 3
32 343 34 544 43 32 7 52 456 98

.

【问题讨论】:

  • int matrix[10][10] = {0.0}; 你的意思是int matrix[10][10] = {0};,对吧?
  • 是的。它实际上在没有 = {0.0}; 的情况下运行
  • 这个问题没有显示任何研究和努力。只需将\n 字符替换为` ` 将完成最大的工作。

标签: c arrays matrix eol


【解决方案1】:

用以下方式重写循环

for(i = 0; i < 10; i++)
{
    for(j = 0; j < 10; j++)
    {
        fscanf(fr, "%d",&matrix[i][j]);
        printf("%3d ", matrix[i][j]);
    }
    printf( "\n" );
}

【讨论】:

    【解决方案2】:

    您正在正确读取数据,但打印不正确。您的程序在每个字符后插入'\n',这就是您看到这么多行的原因。

    像这样更改您的程序以查看您期望的输出:

    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 10; j++)
        {
            fscanf(fr, "%d",&matrix[i][j]);
            printf("%d ", matrix[i][j]); // <<== Replace \n with a single space
        }
        printf("\n"); // <<== Add this line
    }
    

    【讨论】:

      【解决方案3】:

      或者,如果您只想格式化输入,您可以在i 的外循环中写下您的行尾。

      for(i = 0; i < 10; i++)
      {
          for(j = 0; j < 10; j++)
          {
              fscanf(fr, "%d",&matrix[i][j]);
              printf("%d\t", matrix[i][j]);
          }
          printf("\n");
      }
      

      【讨论】:

        【解决方案4】:

        据您所知,EOL 通常是一个LF 字符或CR-LF 字符的组合。在 C 语言中,它们分别由 \n\r\n 表示。

        一个可能的解决方案是您可以使用fgets 一次读取整行(fgets 将仅读取一行)。然后使用sscanfstrtok 从该字符串中读出整数。

        如果你知道每一行的整数个数,我建议你使用sscanf

        否则,如果一行可以包含任意数量的数字,那么您可以使用strtok" "(空格)作为分隔符。

        您可以在此处阅读有关这些功能的更多信息:sscanfstrtok

        【讨论】:

          【解决方案5】:
          fscanf(fr, "%d",&matrix[i][j]);
          printf("%d", matrix[i][j]);
          if(j < 10-1)
              printf(" ");
          else
              printf("\n");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-08
            • 2011-10-14
            • 1970-01-01
            • 2019-11-21
            • 2012-08-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多