【问题标题】:C, Filling a 2D array by tokenizing stringC、通过标记字符串填充二维数组
【发布时间】:2017-10-03 15:08:32
【问题描述】:

我正在尝试用逗号分隔的整数填充二维数组。 我已经为 3x3 数组分配了空间。现在,我正在尝试遍历输入文本的每一行以获取整数并将它们放入数组中。

这是我目前所拥有的:

    char currLine[257];
    char *token;

    for(int i = 0; i < size; i++){

        fgets(currLine, 257, inputFile);

        for(int j = 0; j < size; j++){

        }
}

文本格式如下:

9,8,7
2,1,6
3,4,5

我可以成功抓住每一行,但从那里我一直遇到麻烦。在我得到每个数字之后,我当然希望它进入数组的 [i][j] 点。所以第一行对应[0],第一个值对应[0][0]。

【问题讨论】:

  • sscanf() 怎么样? sscanf(currLine, "%d,%d,%d", &amp;matrix[i][0], &amp;matrix[i][1], &amp;matrix[i][2]); should do it, check that it returns 3. Also, try to use another check, for example esnure that fgets()`确实读到了一些东西,你可以在fgets()之后使用if (!feof(inputFile))或者更好,检查fgets()不返回NULL
  • 我会试试这个。不过,我不熟悉 sscanf 的格式。
  • 您可以使用fscanf() 直接从文件中读取。无需先将其放入带有fgets() 的字符串中。

标签: c arrays io tokenize


【解决方案1】:

标记您提供的格式化文本很简单。看看下面的代码。如果您的目标是浮点数,您可以更改代码。在我的代码中,我假设整数。

#include <stdio.h>
#include <string.h> /* strlen() & memset() */
#include <stdlib.h> /* atoi() */

void getNumbers(const char* ch, int *a, int *b, int *c)
{
    int i;
    int size = strlen(ch) + 1;
    char ar[100];
    int n[3];

    int j = 0;
    int k = 0;


    for(i = 0; i < size; ++i){
        if( ch[i] != ',' )
            ar[j++] = ch[i];

        if ( ch[i] == ',' || i == size-1) {
            ar[j] = '\0';
            n[k++] = atoi(ar);
            memset(ar, 0, sizeof(ar));
            j = 0;
        }

    }

    *a = n[0];
    *b = n[1];
    *c = n[2];

}

int main()
{
  char *num = "1256,524,765";
  int n1,n2,n3;

  getNumbers(num,&n1, &n2, &n3);
  printf("%d  %d  %d\n", n1,n2,n3);

  return 0;
}

结果是

1256  524  765

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2021-02-10
    • 2017-06-29
    • 2015-05-22
    • 1970-01-01
    • 2016-05-26
    • 2018-04-16
    相关资源
    最近更新 更多