扫描到字符串

问题描述:

扫描到字符串

Segmentation fault (core dumped)数组在C,I初始化一个字符串数组,像这样:

char* strings[20]; 

然后试图fscanf一堆东西。

for(int i = 0; i<20; i++){ 
    fscanf(file, "%s", strings[i]); 
} 

虽然程序还有更多,但我确定这是导致分段错误的部分。使用gdb运行表明,错误是在文件vfscanf,所以我认为这是相关的。

+1

您没有为字符串分配内存......当然,当您尝试写入未知地址时它会崩溃。 – thang 2014-09-25 00:16:56

+0

我该怎么做呢?我试着在'for'循环中为每个字符串做'malloc(sizeof(char)* 20)',但它不起作用。我也试过'char * strings [20] = {“”,“”,“”,“”...};'无济于事。 – 2014-09-25 00:24:16

+0

您在'for'循环中尝试过'strings [i] = malloc(sizeof(char)* 20)'?您确定所有读取的20个字符串不超过19个字符(请记住,您需要1个字符作为空终止字符)? – SleuthEye 2014-09-25 00:37:50

你的宣言

char* strings[20]; // This is an array of pointer of type char * 

你需要为每个指针分配内存,然后你可以从文件中读取到他们后。

for(int i = 0; i<20; i++){ 
    strings[i] = malloc(some_size * sizeof(char)); // allocate memory for each pointer first. 
    fscanf(file, "%s", strings[i]); 
} 
+0

这个'fscanf'有一个问题,如果文件包含一个长字,它不会防止缓冲区溢出;和'fscanf'只允许提供编译时常量作为缓冲区长度。如果'some_size'不是一个常量表达式,则需要重写此代码以使用其他输入函数。 – 2014-09-25 02:03:25

+0

感谢您指出@MattMcNabb。只是想说明这里的核心问题。但绝对你是对的:) – Dere0405 2014-09-25 02:06:03

char* strings[20];不初始化“字符串数组”。

而是strings是一个20 char *指针的数组。 C中的字符串是char的数组,最多包括尾部的'\0'。到目前为止,数组Strings[]具有不确定的值,并且没有一个元素肯定指向一个字符串。

通过将这20个指针分配给各种字符串,您将拥有一个“字符串数组”。

// Assign 0 (or NULL) to each pointer. 
char* strings[20] = { 0 }; 

for(int i = 0; i<20; i++){ 
    char buffer[100]; 
    if (fscanf(file, "%99s", buffer) != 1) { 
    break; 
    } 
    strings[i] = strdup(buffer); 
    // or 
    size_t len = strlen(buffer) + 1; 
    strings[i] = memcpy(malloc(len), buffer, len); // error check omitted 
} 

需要注意的是,如果你有scanf()足够现代化的POSIX兼容的版本(检查您的系统手册),你可以使用:

for (int i = 0; i < 20; i++) 
{ 
    if (fscanf(file, "%ms", &strings[i]) != 1) 
     …report error and break/return… 
} 

随着%ms转换规范,scanf()将使用malloc()来为它读取的字符串分配适当的内存量。当你完成它时,不要忘记free()的记忆。

请注意,Mac OS X(10.9.5小牛)没有足够现代版本的scanf()。 Linux(例如,在Ubuntu 14.04中可以找到)的确如此。