我使用此代码来捕获用户的标准输入,然后将其打印回来并保存多个字符。
#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发生了什么?它们在新输入时被删除?为什么呢?
提前致谢
答案 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变量是数组,对吗?那为什么不会发生这种情况呢?
正在发生。 input
是char
的数组10。这肯定是该计划的新版本,因此n
中的char
与input
中的'\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())。