fscanf问题-无法从文件中提取字符串

时间:2018-09-17 02:19:47

标签: c scanf file-handling fgets

当我使用getc时程序正在运行,但不适用于此代码。 我尝试在while循环内打印随机文本,但该文本打印为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);

}

2 个答案:

答案 0 :(得分:0)

这里

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 程序启动中可以看到。

答案 1 :(得分:0)

问题出在以下语句上:

char *str=NULL;

由于您使用fscanf来读取作为字符数组的单词,因此必须将它们读入有效的存储位置。因此,str应该是一个char数组,其长度应等于文件中最长的单词加上1(用于空终止)。

因此将以上内容更改为:

char str[256];
  

7.21.6.2 fscanf函数
  ...

     

12转换说明符及其含义是:

     

s-匹配非空格字符序列。   如果没有l长度修饰符,则相应的参数应为   指向足够大的字符数组的初始元素的指针,可以接受   序列和一个终止的空字符,该字符将自动添加。