使用fscanf()读取一行

Rom*_*omy 0 c scanf segmentation-fault

我试图使用fscanf()从文件中读取一行:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    char c, *string[4];
    int i = 0,j[4];
    fp = fopen("boil.txt", "r");
    c = fgetc(fp);
    if(fp == NULL)
    { printf("File read error\n");
        exit(0);
    }

    while(c != '\n')
    {
        fscanf(fp, "%s %d ", string[i] , &j[i]);
        i++;
        c = fgetc(fp);
    }
    for(i = 0; i < 4; i++)
    {
        printf("%s      %d\n", string[i], j[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

boil.txt如下:

boil 4 boilmilk 3 boilwater 5 heat 10
Run Code Online (Sandbox Code Playgroud)

为什么这个程序会给出分段错误?

Dav*_*eri 5

因为您没有为此类字符串保留空间:

char *string[4];
Run Code Online (Sandbox Code Playgroud)

是一个指向字符串的指针数组,但您需要有空间来存储这些字符串,例如:

char temp[256];

fscanf(fp, "%s %d ", temp , &j[i]);
string[i] = strdup(temp);
Run Code Online (Sandbox Code Playgroud)

编辑:

正如iRove所指出的,strdup它不是标准的一部分(但在许多实现中都可用),如果你不能使用strdup,另一种选择是:

string[i] = malloc(strlen(temp) + 1);
if (string[i] == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}
strcpy(string[i], temp);
Run Code Online (Sandbox Code Playgroud)

不要忘记在结束时免费打电话(当不再需要字符串时)

for (i = 0; i < 4; i++) free(string[i]);
Run Code Online (Sandbox Code Playgroud)

  • 你必须记住,`strdup()`实际上并不是ISO C标准的一部分. (3认同)