为什么这段代码会发出警告:格式'%s'需要类型'char *'但参数2的类型为'char(*)[11]'?

问题描述 投票:-4回答:2
#include <stdio.h>
#include <stdlib.h>
#define RIG 5
#define COL 11

int main()
{
    FILE *fp;
    fp=fopen("swamp.txt","r");
    if((fp=fopen("swamp.txt","r"))==NULL)
    {
        puts("ERROR!");
        return -1;
    }
    char *swamp[RIG][COL];
    while(fscanf(fp,"%s",swamp)!=EOF)
    {
        printf("%s\n",swamp);
    }

    fclose(fp);

    return 0;
}

我正在使用文件,我在fscanf内的while收到2个警告。有人可以向我解释原因吗?

c file
2个回答
0
投票

对于test.txt如下:

aaaaaaa bbbbbbb ccccccc
ddddddd eeeeeee fffffff
ggggggg hhhhhhh iiiiiii
jjjjjjj kkkkkkk lllllll

您可以使用此代码获取数据(它可以处理4行3列中最多8个字符的单词):

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    enum {
        ROWS = 4,
        COLS = 3
    };

    FILE *fp;
    char test[ROWS][COLS][9];
    int counter = ROWS * COLS;

    if ((fp = fopen("test.txt", "r")) == NULL) {
        perror("fopen()");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < ROWS * COLS; i++) {
        if (fscanf(fp, "%8s", test[i / COLS][i % COLS]) == EOF) {
            counter = i;
            break;
        }
    }

    fclose(fp);

    for (int i = 0; i < counter; i++) {
        printf("%s ", test[i / COLS][i % COLS]);
        if ((i + 1) % COLS == 0) {
            printf("\n");
        }
    }

    return EXIT_SUCCESS;
}

0
投票

让我们假设swamp.txt包含:

marsh
bog
quagmire
morass
fen

并且您希望在程序中将这些行读入数组swamp。然后你可以沿着这些方向修改你的代码。请注意,这可以避免在其他清理操作中打开文件两次。

#include <stdio.h>

#define RIG 5
#define COL 11

int main(void)
{
    const char filename[] = "swamp.txt";
    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        fprintf(stderr, "failed to open file '%s' for reading\n", filename);
        return -1;
    }
    char swamp[RIG][COL];
    int i = 0;
    while (i < RIG && fscanf(fp, "%10s", swamp[i]) == 1)
        i++;

    fclose(fp);

    for (int j = 0; j < i; j++)
        printf("%d: %s\n", j, swamp[j]);

    return 0;
}

输出是:

0: marsh
1: bog
2: quagmire
3: morass
4: fen

请注意,代码通过在读取单词时对其进行计数来防止长文件溢出。你已经检查了fopen() - 这很好。不过,我改进了错误信息。在我看来,你永远不应该用文字名称的文字字符串调用fopen(),因为当你在打开文件时报告错误时,你需要在错误信息中输入文件名,所以你必须重复自己。我修复了数组的类型,因此它是char的2D数组,而不是(未初始化的)char指针的2D数组。我安排将阵列的每一行依次传递给fscanf()。我限制了每个单词的输入长度,以防止溢出。

© www.soinside.com 2019 - 2024. All rights reserved.