繁体   English   中英

扫描到字符串数组

[英]Scan to Array of Strings

Segmentation fault (core dumped)

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

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

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兼容版本(请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中找到)可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM