【问题标题】:Cant scanf '-' or '+' in char array无法在 char 数组中扫描“-”或“+”
【发布时间】:2017-03-19 05:59:10
【问题描述】:

我正在上学做作业。任务是用 C 语言编写程序,可以用 *、-、+ 等矩阵做一些简单的事情。

我的程序正在读取矩阵并将它们保存到 int 数组。当矩阵输入结束时,我扫描到 char 以了解我将对矩阵执行什么操作。操作是存储在 char 数组中。 (输入最多可以有 100 个矩阵,因此中间有 99 个操作)。如果用户写 * 一切正常,但是当用户写“-”或“+”时它存储“/n”。我正在谷歌搜索和调试,但仍然不知道为什么会发生这种情况。欢迎任何建议。

用户输入如下所示:第一行是矩阵的大小。

2 3

76 98 -31

30 30 32

-

2 3

89 25 38

1 -32 -38

    int* readMatrix(int width, int height, char arrayOperation[], int numberOfMatrix, int*err)
    {
    int sizeOfMatrix = ((height*width) + 3), i = 0;
    char operation = 'n';
    int *arrayMatrix = malloc(sizeOfMatrix* sizeof(int));
    arrayMatrix[0] = width;
    arrayMatrix[1] = height;
    for (i = 2; i <= sizeOfMatrix; i++)
    {
           if (i == sizeOfMatrix)
           {
                   if (scanf_s("%c", &operation) != EOF)
                   {
                           if (operation == '*' || operation == '-' || operation == '+')
                           {
                                  arrayOperation[numberOfMatrix] = operation;
                           }
                           else
                           {
                                  *err = 100;
                           }
                    }
                    else
                    {
                    arrayOperation[numberOfMatrix] = 'n';
                    break;
                    }
            }
            else if (scanf_s("%d", &(arrayMatrix[i])) == 1)
            {
                      *err = 0;
            }
    }
    return arrayMatrix;
    }

在 * 的情况下,var 操作==*,但在 -,+ 操作中==/n。我在循环中调用这个函数,输出数组存储在 int** 数组中。

【问题讨论】:

  • 除非您的学校要求,否则不要使用scanf_s。它不是标准的 C 函数,而是 Microsoft 扩展。 scanf 是标准 C。
  • 通常我在linux中使用终端来编译运行和调试。但是这次我不确定是什么问题,所以我使用VS进行调试。所以就当它是“scanf”吧。
  • 有邪恶的scanf_s()scanf() - 避免他们 - 他们不是你的朋友。当读取 lines 的输入时,使用良好的fgets()。然后代码可以通过多种方式sscanf()行,寻找数字,-
  • @DUman scanf_s 在 C11 标准附录 K.3.5.3.4 中指定

标签: c arrays matrix char


【解决方案1】:

我正在和我的讲师讨论这个特殊问题。

我明白这一点:当 scanf 读取数字时,它会跳过空格和 /n。

因此阅读“32/n -”会导致阅读所有内容。读取“32/n *”时,它停在“*”,因为它没有任何数字的符号。所以它的行为有点愚蠢。

这可以使用 fgets() 函数解决并通过 char 读取。

【讨论】:

    【解决方案2】:

    scanf("%c" 读取下一个字符而不跳过任何空格,因此它将存储最后读取的内容之后的任何内容——通常是换行符。如果要跳过空格,请在格式中添加空格:

    scanf(" %c", &operation)
    

    这将跳过任何空白并存储下一个非空白字符。

    %d 不需要这个,因为所有转换模式除了%c%[ 跳过空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多