【问题标题】:Storing strings from a text file into a two dimensional array将文本文件中的字符串存储到二维数组中
【发布时间】:2015-04-01 03:55:44
【问题描述】:

我正在使用 C 进行一个项目,对于该项目,我必须读取一个文本文件并将每个单词存储到一个数组中。我还必须从单词中删除标点符号,因此我需要使用二维数组来编辑单词。我无法弄清楚如何自行获取二维数组中的单词。这是我到目前为止所做的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1001
#define LINES 81

int main(void) {
    int stringSize;
    int i =0;
    char *x[MAX][LINES];
    char str[MAX];
    char y[MAX];
    FILE *fp;

    fp = fopen("TwoCitiesStory.txt","r");
    if(fp == NULL) {
        printf("Cannot open file.\n");
        exit(1);
    }

    while(!feof(fp)) {
        for(i=0;i<MAX;i++){
            fscanf(fp,"%s",x[i][LINES]);
        }
    }

    return 0;
}

【问题讨论】:

  • 你想从文件中读取一行...因为 %s 只会读取单词
  • 例如,如果文本文件包含“Hi my name is Bob”。我需要数组来保存 x[0][]="Hi" x[1][]="my" 等等。文本文件最大字数为1000字,字数最大为80个字符。
  • 那么您在使用此代码时遇到了什么问题
  • char x[MAX][LINES];..for(i=0;i&lt;MAX;i++){ fscanf(fp,"%80s",x[i]); }
  • 您错误地使用了feofstackoverflow.com/questions/5431941/…

标签: c arrays string


【解决方案1】:

下面一行

char *x[MAX][LINES];

声明了一个二维指针数组。你需要的只是一个二维字符数组。

char x[MAX][LINES];

读单词的代码可以简化为:

while( i < MAX && fscanf(fp, "%80s", x[i]) == 1 )
{
   ++i;
}

【讨论】:

    【解决方案2】:
    1. 使用fgets()阅读整行
    2. 将读取的行存储到二维数组中

    整个代码看起来像

    char x[row][col];
    char buf[300];
    int i=0,j=0;
    memset(x,0,sizeof(x));
    while(fgets(buf,sizeof(buf),fp))
    {
      size_t n = strlen(buf);
      if(n>0 && buf[n-1] == '\n')
      buf[n-1] = '\0';
      if(i>= row && n> col)
      break;
      strcpy(x[i],buf);
      i++;
    
    }
    

    编辑:

    如果您需要数组中的每个单词。 buf 用于读取整行。 strtok() 用于将行分隔为以空格为分隔符的单词。 然后将每个单词存储在每一行中。

    size_t n;
    while(fgets(buf,sizeof(buf),fp))
    {
       char *p = strtok(buf," ");
       while( p != NULL)
       {
          n = strlen(p);
          if(i>= row && n> col)
          break;
          strcpy(x[i],p);
          i++;
          p = strtok(NULL," ");
       }
    }
    

    如果你想打印出数组去

    int i;
    for(i=0;i<row;i++)
    printf("%s\n",x[i]);
    

    Why feof() is wrong

    【讨论】:

    • 这不会分隔数组中的每个单词。例如,如果文本文件包含“嗨,我的名字是 Bob”。我需要数组来保存 x[0][]="Hi" x[1][]="my" 等等。文本文件最大字数为1000字,字数最大为80个字符。
    • 它自己运行的代码成功,但我对你如何得到这个答案有点困惑。 row 是单词的最大数量,col 是单词本身的长度吗?首先你创建了 char x[row][col];它创建了一个字符数组,然后您创建了 buf[300];。但是 buf 是做什么的呢?如果我必须在之后打印单词,我应该调用哪个数组?我尝试这样打印: for(i=0;i
    • @beginner_coder 您可以打印出编辑中显示的二维数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2020-12-19
    • 2018-10-03
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多