【问题标题】:fscanf Issue-Not able to extract string from filefscanf 问题 - 无法从文件中提取字符串
【发布时间】:2026-01-23 18:40:01
【问题描述】:

当我使用 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);

}

【问题讨论】:

  • 使用str[100]fscanf
  • 要读取文件fscanf(fp,"%s",str) 中的示例文本是什么?
  • @Observer 字符指针有什么问题?
  • @chux 只是随机词。

标签: c scanf file-handling fgets


【解决方案1】:

问题出在这句话上:

char *str=NULL;

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

所以把上面的改成:

char str[256];

7.21.6.2 fscanf 函数
...

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

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

【讨论】:

    【解决方案2】:

    这里

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

    【讨论】: