扫描到字符串
的
Segmentation fault (core dumped)
数组在C,I初始化一个字符串数组,像这样:
char* strings[20];
然后试图fscanf
一堆东西。
for(int i = 0; i<20; i++){
fscanf(file, "%s", strings[i]);
}
虽然程序还有更多,但我确定这是导致分段错误的部分。使用gdb运行表明,错误是在文件vfscanf
,所以我认为这是相关的。
你的宣言
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]);
}
这个'fscanf'有一个问题,如果文件包含一个长字,它不会防止缓冲区溢出;和'fscanf'只允许提供编译时常量作为缓冲区长度。如果'some_size'不是一个常量表达式,则需要重写此代码以使用其他输入函数。 – 2014-09-25 02:03:25
感谢您指出@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中可以找到)的确如此。
您没有为字符串分配内存......当然,当您尝试写入未知地址时它会崩溃。 – thang 2014-09-25 00:16:56
我该怎么做呢?我试着在'for'循环中为每个字符串做'malloc(sizeof(char)* 20)',但它不起作用。我也试过'char * strings [20] = {“”,“”,“”,“”...};'无济于事。 – 2014-09-25 00:24:16
您在'for'循环中尝试过'strings [i] = malloc(sizeof(char)* 20)'?您确定所有读取的20个字符串不超过19个字符(请记住,您需要1个字符作为空终止字符)? – SleuthEye 2014-09-25 00:37:50