【问题标题】:all array elements are the same fgets in C?所有数组元素在 C 中都是相同的 fgets 吗?
【发布时间】:2019-03-15 10:26:02
【问题描述】:

所以目前我的程序使用这样的硬编码数组:

char *array[] = {"array","ofran","domle","tters", "squar"}

基本上是 n 个长度为 n 的字符串“一个 n*n 网格。然后我将这些值视为 2D 数组。所以我将访问 array[y][x] 并使用相应的 ASCII 进行比较操作和数学运算。

我想在我的程序中实现各种大小 (n*n)(最多 32 个)的文本文件,而不是对其进行硬编码。但是在使用 fgets 时遇到问题。

我当前获取和存储文件信息的函数如下所示:

char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");

int n = 0;
while(fgets(buffer, 32, fp)){
    array[i] = buffer;
    n++;
}
fclose(fp);

但“array”的所有值都是相同的(它们是最后一个字符串)。因此,对于上面的示例值。如果我将数组 [0] 打印到数组 [4] 我得到

我的代码中的值

squar
squar
squar
squar
squar

预期值:

array
ofran
domle
tters
squar

【问题讨论】:

  • array[i] = buffer; 只是将相同的指针分配给array 的所有元素。您需要在这里进行动态内存分配,或者可能需要一个 char 的二维数组。
  • 使用 strcpy 而不是分配字符串。
  • @aragon 使用 strcpy 而不是分配字符串 不,不要那样做。 array 中的指针指的是固定长度的,可能是只读的常量字符串字面量。

标签: c arrays file


【解决方案1】:

array[i] = buffer 只是将相同的指针分配给array 的所有元素。这里需要动态内存分配:

char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");

int n = 0;
while(fgets(buffer, 32, fp)){
    array[i] = strdup(buffer);  // allocate memory for a new string
                                // containing a copy of the string in buffer
    n++;
}
fclose(fp);

为简洁起见,此处未进行错误检查。此外,如果输入文件包含超过 32 行,您会遇到麻烦。

如果您的平台上不存在strdup

char *strdup(const char *str)
{
  char *newstring = malloc(strlen(str) + 1);  // + 1 for the NUL terminator
  if ( newstring )
    strcpy(newstring, str);
  return(newstring);
}

为简洁起见,这里再次没有进行错误检查。

【讨论】:

  • 现在您遗漏了return 声明。那些日子中的一天? :-)
【解决方案2】:

鉴于此代码:

char buffer[32];

有多少个buffer 变量?

一个。

所以这段代码

array[i] = buffer;

array 的每个char * 元素指向ONE buffer

(一个解决方法是在他的答案中发布@Jabberwocky - 使用strdup()

【讨论】:

    【解决方案3】:
    char *array[32];
    char buffer[32];
    ....    
    while(fgets(buffer, 32, fp)){
        array[i] = buffer;
    ....
    

    查看您的变量:第一个是 32 个 char* 指针的数组,第二个是 32 个 char 数组。 在 while 循环中,您还只需将数组上的每个元素都分配给同一个缓冲区。你有看到?虽然 fgets 只是用最新数据不断刷新/更新该缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多