【问题标题】:Put a string in a matrix in C将字符串放入C中的矩阵中
【发布时间】:2012-08-03 11:57:41
【问题描述】:

我需要将一个字符串(来自一个文件)放入一个矩阵并打印出结果。我在理解这样做的正确方法方面存在一些问题:

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[])
{
    const int MAX = 50;
    char mat[MAX][MAX];
    char str[MAX];
    char word[MAX];
    int row = 0;
    int i = 0;

    FILE * fp;

    fp = fopen ("file.txt", "r");

    if (fp == NULL)
        printf ("Error!\n");

    while (fgets(str, MAX, fp) != NULL)
    {
        sscanf (str, "%s\n", word);

        strcpy(mat[i][0], word);

        row++;
    }

    for (i = 0; i <= row; i++)
    {
            puts(mat[i][0]);
    }

    return 0;
}

我在不知不觉中做错了什么,但是……什么?

我有一个这样的文件:

One
Two
Three
Four
Five
Six
Hello

【问题讨论】:

  • 您在 while(fgets ...) 循环期间没有更改 i,所以一直是 i = 0

标签: c string matrix


【解决方案1】:

如果你用gcc编译它,它会给你两个警告:每个警告都指向代码中的三个主要错误之一:

main.c: In function 'main':
main.c:24: warning: passing argument 1 of 'strcpy' makes pointer from integer without a cast
main.c:31: warning: passing argument 1 of 'puts' makes pointer from integer without a cast

这些行号(24 和 31)中的每一个都是您使用 mat[i][0] 的行,它是一个字符,而您应该使用 mat[i],它是一个字符数组。修复这些,然后只有一个问题:在while 循环中使用i,它始终为0。使用row,随着行的进行而递增,程序应该完全按照设计工作。

为了改进程序,我还需要更改其他几项:while 循环将字符串读入一个缓冲区,将其复制到第二个缓冲区,然后将其复制到矩阵中;您可以直接将其扫描到矩阵中并完成它!

【讨论】:

  • 谢谢。我唯一的最后一个疑问是矩阵结构。如果只有一维 (i),mat[i] 怎么可能是字符数组?
  • 至少从概念上讲,您可以将矩阵视为数组数组;即,mat[0][0]charmat[0]char 的数组,matchar 的数组数组。这有意义吗?
【解决方案2】:

矩阵通常包含数字。你的包含chars。您的代码存在问题,但为了得到一个好的答案,您应该告诉我们您正在阅读的文件的格式(可能在您的问题中粘贴一个小格式)。

编辑: 该文件包含一个由换行符分隔的字符串数组。您可以这样阅读(如果字符串中没有任何空格):

    while (fscanf(fp, "%s\n", mat[row]) > 0)
    {
        row++;
    }

    for (i = 0; i <= row; i++)
    {
            printf( "%s\n", mat[i]);
    }

【讨论】:

  • 这根本没有帮助。文件格式很明显(每行一个字),代码中有一些明显的错误需要修复。)当然,说矩阵只能包含数字是错误的。
  • 这假设您有一个字符串数组,而不是矩阵。矩阵是二维的。
【解决方案3】:

您应该将字符串复制到具有给定索引的矩阵元素。您应该将指向矩阵第一个元素的指针传递给 strcpy(即删除 [0])。

执行以下操作:

while (fgets(str, MAX, fp) != NULL)
{
    sscanf (str, "%s\n", word);
    strcpy(mat[i], word);
    row++;
}

编辑:打印字符串时也只使用 mat[i] 而不是 mat[i][0]。

【讨论】:

    【解决方案4】:

    我对您的代码做了一些更改。首先让我们指出你的错误。

    1. char mat[MAX][MAX]; 不会满足您创建字符串矩阵的意图。

    2. 没有必要阅读sscanf (str, "%s\n", word);。您已经从文件中读取了它。你可以直接使用它。

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      int main (int argc, char *argv[])
      {
          const int MAX = 50;
          char *mat[MAX][MAX];
          char str[MAX];
          int i = 0, j = 0;
          int now = 0;
      
          FILE * fp;
      
          fp = fopen ("file.txt", "r");
      
          if (fp == NULL)
              printf ("Error!\n");
      
          while (fgets(str, MAX, fp) != NULL)
          {
              //sscanf (str, "%s\n", word);
      
              mat[i][j] = malloc(sizeof(str));
      
              strcpy(mat[i][j], str);
      
              j++;
              now++; //Tracks no.of elements 
              if(j == MAX)
              {
                   j = 0;
                   i++; //store in next row  
              }
          }
       for (i = 0; i < MAX; i++)
              for (j = 0; j < MAX; j++)
          {
                  if(now == 0)
                      break;
      
                  now--;
      
                  puts(mat[i][j]);
                  free(mat[i][j]);//Avoids memory leak        
          }
      
      return 0;
      

      }

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多