0

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

#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
4

4 回答 4

3

如果你用 编译它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],它是一个字符数组。修复这些,然后只有一个问题:在循环中使用i始终为 0 的。while使用row,随着行的进展而增加,程序应该完全按照设计工作。

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

于 2012-08-03T12:04:59.810 回答
2

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

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

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

    for (i = 0; i <= row; i++)
    {
            printf( "%s\n", mat[i]);
    }
于 2012-08-03T12:02:50.190 回答
1

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

执行以下操作:

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

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

于 2012-08-03T12:03:35.087 回答
0

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

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

  2. 没有必要做 read 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;
    

    }

于 2012-08-03T12:29:52.767 回答