【问题标题】:Putting strings into a 2D chararray in C将字符串放入C中的2D chararray
【发布时间】:2009-10-21 12:57:05
【问题描述】:

如何将字符串从(例如)文件放入 2D 字符数组?

char buffert[10][30];
int i = 0;

while(!feof(somefile)) {
  fscanf(somefile, "%s", temp);
  buffert[i][] = temp;
  i++;
}

这样不行。

【问题讨论】:

标签: c arrays string char


【解决方案1】:

试试这个:

while(i < 10 && fscanf(somefile, "%29s%*[^ \t\n]", buffer[i]) != EOF) {
  i++;
}

"%29s" 格式说明符最多可将 29 个字符读入 buffer[i],这是它的全部空间。 "%*[^ \t\n]" 读取并丢弃非空格,以防字符串超过 29 个字符。

此外,while (!feof()) { } 几乎总是错误的做法,因为在遇到文件结尾之前不会在流上设置EOF

【讨论】:

  • 好的,很好的答案,我稍后会通过内置检查来检查这个更高级的东西。
【解决方案2】:

盗自this forum:

#include <stdio.h>

main()
{
  int dirsize = 80;
  char array[9][dirsize];
  int linenum = 0;
  FILE *filepointer;
  filepointer = fopen("projectfile.txt","r");
  while (feof(filepointer) == 0)
  {
    linenum++;
    fgets(array[linenum], dirsize, filepointer);
  }
  fclose(filepointer);
} 

另一个使用指向数组的指针而不是数组数组is here.的解决方案

【讨论】:

    【解决方案3】:

    在我看来,您实际上是在将字符串复制到数组中。我很惊讶它编译。我错过了什么吗?

    查看 strcpy 或 strncpy,或者您可以使用 for 循环进行复制。

    【讨论】:

      【解决方案4】:

      取消临时,将每个字符串直接放入您为其创建的空间(在本例中为缓冲区)。

      char buffert[10][30];
      int i = 0;
      FILE * fp = fopen("myfile", "r");
      while(!feof(fp)) { 
        fscanf(fp, "%s", buffert[i]);
        i++;
      }
      

      这里的文件指针叫做fp。您必须进行一系列检查,以防止溢出缓冲区中可用的 10 个条目,或每个字符串中可用的 30 个字符。您还应该避免使用 feof()。

      【讨论】:

      • 这有两个问题:过长的字符串,或者过多的字符串,都会溢出buffert;并且当到达文件结尾时,i 将增加一倍,因为fscanf 的返回值没有经过测试。
      • 我同意,这就是为什么我提供有关支票的警告。但是,我想提供最简单的变体来证明 OP 需要的观点。这是一个教学法。
      • @Sinan Ünür:哎哟!我的观点根本与 feof() 无关。我是否必须挑剔 OP 的问题以避免被蜇伤?
      • @Ewan Todd:feof 错误并非微不足道,指出它并不是吹毛求疵。当然,您可以修复您的答案,而不是帮助使错误代码永久存在,在这种情况下,我的反对票将被撤销。
      • @Ewan Todd,我不认为这是为了避免 feof(),我认为这是关于正确使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多