[英]How to use scanf to scan for multiple words?
我正在尝试处理接受输入、最小字符限制和最大字符限制的 function。 即使有 2 个或更多单词,我也需要接受输入并计算字母,我看到人们说scanf("%30[^\n]%*c")
可以解决问题。 但是,这仅在它是第一个输入时才有效,仅此而已。 如果上面有任何输入,它将终止该行,将 count 保留为零,并无限运行循环。 有谁知道为什么?
注意:我不能使用 <string.h> header 文件中的任何内容。
{
int n = 1;
while (n == 1)
{
int count = 0;
scanf("%30[^\n]%*c", input);
while (input[count] != '\0')
{
count++;
}
if (minimum == maximum)
{
if (count > maximum)
{
printf("String length must be exactly %d chars: ", minimum);
}
else if (count == minimum)
{
n = 0;
return input;
}
else if (count < minimum)
{
printf("String length must be exactly %d chars: ", minimum);
}
}
else
{
if (count > maximum)
{
printf("String length must be no more than %d chars: ", maximum);
}
else if (minimum <= count && count <= maximum)
{
n = 0;
return input;
}
else if (count < minimum)
{
printf("String length must be between %d and %d chars: ", minimum, maximum);
}
}
}
}
scanf("%30[^\n]%*c", input);
的问题如果来自stdin
的新字节是换行符,它是否会失败,返回0
并保持input
不变,可能未初始化,导致代码的 rest 具有未定义的行为。
另请注意,此格式将导致scanf()
在转换后读取并丢弃待处理的字节,无论是换行符,这是您的意图,还是用户在输入行上键入的任何第 31 个字符。
您应该测试scanf()
的返回值以检测转换错误和/或文件结尾,并且仅在scanf()
返回1
时扫描数组。
您应该在行尾使用循环丢弃多余的字节:
int c;
while ((c = getchar()) != EOF && c != '\n')
continue;
或使用scanf()
:
scanf("%*[^\n]"); // discard the rest of the input line if any
scanf("%*c"); // discard the newline if any.
要摆脱先前调用scanf()
留下的挂起换行符,您可以编写:
int c;
if ((c = getchar()) != '\n')
ungetc(c, stdin);
或使用scanf
:
scanf("%1*[\n]"); // read and discard at most 1 newline byte
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.