【问题标题】:Problems with fgets and strtok in CC 中 fgets 和 strtok 的问题
【发布时间】:2017-01-26 20:14:54
【问题描述】:

我需要用字符串中的数字填充二维数组,所以我使用strtokfgets 来获取字符串并对其进行标记。但是,如果我输入“1 2 3 4 5”并且二维数组的尺寸为 2x2,则 5 永远不会分配给 number。我想检查是否有超过矩阵可以容纳的数字,但number 在将 4 添加到矩阵而不是 5 之后总是以 NULL 结束。我知道 SIZE 是正确的,因为如果我之前打印出 stringInputted strtok 它打印出正确的输出。

scanf("%d", &rows);
scanf("%d", &columns); 
//SIZE = 2*rows*columns+1
//rows and columns are user inputted and stored using scanf
fgets(stringInputted, SIZE, stdin);
 char *number = strtok(stringInputted, " \n");

 for(i = 0; i < rows; i++){
    for(j = 0; j < columns; j++){
        if(number != NULL)
            matrix[i][j] = atoi(number);
        else{
            printf("ERROR Insufficient numbers entered\n");
            return 0;
        }
        number = strtok(NULL, " \n");
    }
 }
 if(number != NULL) printf("TOO MANY NUMBERS\n");

【问题讨论】:

  • 能否包含您对SIZErowscolumns 的定义?另外,您的问题提到了input,但您的代码列出了stringInputted
  • 已编辑。 @chrisaycock
  • 包装在 main 函数中时无法重现。对于 2x2 矩阵,3 个值给出“ERROR insufficient...”,5 个值给出“TOO MANY NUMBERS”,4 个值则保持安静。
  • 嗯,这很奇怪,你是如何输入这些值的?我有它,所以用户将它们输入 1 个字符串“2 2 1 2 3 4...” 前两个将是矩阵的大小。 @WeatherVane
  • 1 2 3 4 5 的长度为9。所以SIZE需要10个或更多。

标签: c arrays multidimensional-array fgets strtok


【解决方案1】:

您的SIZE 不正确。

fgets() 从流中最多读入一个小于 size 的字符...一个终止的空字节 ('\0') 存储在缓冲区中的最后一个字符之后。

所以你需要消耗 10 个字节,而不是 9 个。

【讨论】:

  • 如果我不知道用户将输入多少个数字,我将如何分配 SIZE?就像他们想要一个 2x2 矩阵但他们输入 10 个数字(所以 20 个字符包括空格)
  • @TirthRami 这就是用 C 语言读取用户字符串的问题。其他语言会自动增大缓冲区。在 C 语言中,如果您发现有更多可用输入,则必须使用动态内存分配和 realloc() 数组。这是一个复杂的话题,远远超出了一条评论的范围。
  • @TirthRami 为什么需要读取无法处理的数字?如果有符号的int 包括空格在内可以有 12 个字符,则最大字符串长度将为rows * columns * 12 + 2(换行符和 nul)。添加另一个12,这样您就可以知道是否输入了太多数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多