扫描到字符串数组

时间:2014-09-25 00:12:34

标签: c arrays string pointers scanf

Segmentation fault (core dumped)

在C中,我初始化了一个字符串数组,如下所示:

char* strings[20];

然后尝试了fscanf一堆东西。

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

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

3 个答案:

答案 0 :(得分:4)

宣布后

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]);
}

答案 1 :(得分:1)

char* strings[20];没有初始化&#34;字符串&#34;数组。

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

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

// 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
}

答案 2 :(得分:1)

请注意,如果您拥有足够现代的POSIX兼容版scanf()(请查看系统手册),您可以使用:

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 Mavericks)没有足够现代的scanf()版本。 Linux(例如,在Ubuntu 14.04中可以找到)。