当我使用getc时,程序正在运行,但它不能使用此代码。我尝试打印随机文本,而循环它打印为NULL。
void main()
{
FILE *fp;
char *str=NULL;
char s;
fp=fopen("text.txt","r");
if(fp==NULL)
{
printf("\nCAN NOT OPEN FILE");
exit(EXIT_FAILURE);
}
while(fscanf(fp,"%s",str)!=EOF)
{
printf("%s",str); //not taking any values in str,prints NULL
}
fclose(fp);
}
问题出在这个声明中:
char *str=NULL;
由于您使用fscanf
读取字符数组的单词,因此必须将它们读入有效的内存位置。所以str
应该是一个char
数组,其长度应该等于文件中最长的单词加1(对于空终止)。
所以将上面改为:
char str[256];
7.21.6.2 fscanf函数 ...
12转换说明符及其含义如下:
s - 匹配一系列非空白字符。如果不存在l length修饰符,则相应的参数应该是指向大小足以接受序列的字符数组的初始元素的指针以及将自动添加的终止空字符。
这里
char *str=NULL;
str
是一个指针变量&它用NULL
初始化,这是非常好的但是要存储到str
中,即从文件中读取单词,并存储到str
它应该有有效的内存。因此要么为str
动态分配内存
str = malloc(SIZE); /* define SIZE */
或者使用像。一样的字符数组
char str[100]; /* let say each word of file is less than 100 char's */
例如
char str[100];
while(fscanf(fp,"%s",str)!=EOF) {
printf("%s",str);
}
而不是使用void main() { }
int main(void) {
/* some_code */
return 0;
}
从C Standard可以看到5.1.2.2.1程序启动。