为什么此代码会给出警告: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()
。我限制了每个单词的输入长度,以防止溢出。changechar*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