空格字符会影响从scanf返回的输入大小

时间:2015-10-13 13:03:14

标签: c size whitespace scanf

我使用此代码来捕获用户的标准输入,然后将其打印回来并保存多个字符。

#include <stdio.h>

int main()
{
    char input[100];
    int inputSize;
    while (scanf("%99s%n", input, &inputSize) != EOF)
    {
        printf("INPUT: %s, SIZE %d\n", input, inputSize);
    }
    return 0;
}

这些是结果:

> hello
INPUT: hello, SIZE: 5
> hello
INPUT: hello, SIZE: 6

为什么尺寸不一样? 我怎样才能每次都获得准确的尺寸?

最后: char变量是数组,对吗? 那为什么不会发生这种情况呢?

> AAAAAAAAAA
INPUT: AAAAAAAAAA, SIZE: 10
> BBBBB
INPUT: BBBBBAAAAA, SIZE: 6

保存的10x A发生了什么?它们在新输入时被删除?为什么呢?

提前致谢

2 个答案:

答案 0 :(得分:1)

  

为什么尺寸不一样?

用户输入为“hello \ nhello \ n”。

第一次scanf("%99s%n", input, &inputSize)次扫描"hello\n"。将'\n'视为尾随空格,将其重新置于stdin。因此扫描 5 char,在char中节省5 input。然后,它会将'\0'附加到input

下一次scanf("%99s%n", input, &inputSize)次扫描"\nhello\n""%s"扫描但不保存前导空白区域。将第二个'\n'看作尾随空格,将其重新放回stdin。因此扫描 6 char,在char中节省5 input。然后,它会将'\0'附加到input

  

我怎样才能每次都获得准确的尺寸?

输入相同的内容 - 在第一个“Hello”之前键入 Enter "%s"在行尾之前结束扫描。不使用scanf()的真正解决方案。如果用户输入是 line ,请使用fgets()getline(),然后根据需要进行解析。

  

... char变量是数组,对吗?那为什么不会发生这种情况呢?

正在发生。 inputchar的数组10。这肯定是该计划的新版本,因此n中的charinput中的'\n'保存匹配,因为之前没有> AAAAAAAAAA INPUT: AAAAAAAAAA, SIZE: 10 要丢弃。

A
  

保存的10x A发生了什么?它们在新输入时被删除?为什么呢?

input中保存的B"BBBBBAAAAA"覆盖。

为什么最后一个输出是"BBBBB"而不是(?P<key>.*?)(?P<operator>NOT LIKE|LIKE|<=>|>=|<=|!=|<>|=|>|<)(?P<values>.*) 仍然是个谜。鉴于“SIZE:6”,怀疑OP转录错误。

答案 1 :(得分:0)

scanf("%99s%n", input, &inputSize)

将写入x char读取&#34;输入&#34;的x个第一个字节。 你可以尝试

scanf("%99s%n", &input[TotalAmountOfBytesRead], &inputSize)

然后,它将向scanf提供尚未写入的第一个字节的地址。 请注意缓冲区溢出(提示:malloc()/ realloc())。