为什么此代码会给出警告:format';%s';预期类型为';字符*';但参数2的类型为';字符(*)[11]';? #包括 #包括 #定义装备5 #定义第11列 int main() { 文件*fp; fp=fopen(“沼泽”txt,“r”); if((fp=fopen(“spumb.txt”,“r”))==NULL) { 放置(“错误!”); 返回-1; } 沼泽[钻井平台][COL]; 而(fscanf(fp,“%s”,沼泽)!=EOF) { printf(“%s\n”,沼泽); } fclose(fp); 返回0; }

为什么此代码会给出警告:format';%s';预期类型为';字符*';但参数2的类型为';字符(*)[11]';? #包括 #包括 #定义装备5 #定义第11列 int main() { 文件*fp; fp=fopen(“沼泽”txt,“r”); if((fp=fopen(“spumb.txt”,“r”))==NULL) { 放置(“错误!”); 返回-1; } 沼泽[钻井平台][COL]; 而(fscanf(fp,“%s”,沼泽)!=EOF) { printf(“%s\n”,沼泽); } fclose(fp); 返回0; },c,file,C,File,我正在处理文件,我在while中收到了两条关于fscanf的警告。有人能给我解释一下原因吗?对于test.txt,如下所示: #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) {

我正在处理文件,我在
while
中收到了两条关于
fscanf
的警告。有人能给我解释一下原因吗?

对于
test.txt
,如下所示:

#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;
}
您可以使用此代码获取数据(它可以处理4行3列中最多8个字符的字):

#包括
#包括
内部主(空)
{
枚举{
行=4,
COLS=3
};
文件*fp;
字符测试[行][COLS][9];
int计数器=行*列;
if((fp=fopen(“test.txt”,“r”))==NULL){
perror(“fopen()”);
返回退出失败;
}
对于(int i=0;i
让我们假设
沼泽.txt
包含:

#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;
}
您希望将这些行读入程序中的数组
沼泽
。然后,您可以按照这些思路修改代码。请注意,这避免了在其他清理操作中打开文件两次

marsh
bog
quagmire
morass
fen

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

change
char*Swarm[RIG][COL]到<代码>字符沼泽[RIG*COL]。然后,
沼泽
将具有
%s
的正确类型。它可以工作,但为什么呢?您的
沼泽
是指向
字符
的2D数组指针,但是
%s
需要指向
字符的指针(或衰减为一个数组)。因此,基本上您所做的是将其从一维数组调整为二维数组。您能解释一下原因吗,关闭文件并再次打印SPARM后,仅显示1行?因为
SPARM
变量仅存储一个(上次)读取值。是否要将
spoom.txt
中的所有数据存储在
spoom
变量中?是否只有for cicles可以这样做?这是什么意思?你想扔掉什么?
marsh
bog
quagmire
morass
fen
#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