亲爱的叠花同胞,
如何处理 0 个用户输入?
例如,如果用户输入" "或只是按 ENTER,您如何处理?
#include <stdio.h>
#include <string.h>
int main() {
printf("> n");
char string[129];
int i = 0, length = 0, flag = 0;
printf("Input a string: ");
scanf("%128s", string);
if(strlen(string) != 0) {
printf("%sn", string);
} else {
printf("Please enter at least one argument.");
}
}
引用C11
,第7.21.6.2章,fscanf()
,关于%s
转换说明符,
s
匹配一系列非空格字符。
以及关于执行转换说明符
的步骤跳过输入空格字符(由
isspace
函数指定),除非 规范包括[
、c
或n
说明符。
因此,除非输入流中存在非空格字符,否则它将等待。不会进行匹配。
此外,检查 scanf()
和 family 的返回值以确保扫描成功非常重要。
也就是说,至少应该int main(void)
int main()
以符合标准。
用scanf()
实现这一目标可能是不可能的,我没有兴趣找出它是否可能,因为这个解决方案
#include <stdio.h> /* For fgets(), fprintf() and printf() */
#include <stdlib.h> /* For EXIT_FAILURE */
#include <ctype.h> /* For isspace() */
int
please_enter_at_least_one_argument()
{
fprintf(stderr, "Please enter at least one argumentn");
return EXIT_FAILURE;
}
int
main(void)
{
char string[130];
printf("> n");
printf("Input a string: ");
if (fgets(string, sizeof(string), stdin) == NULL)
return please_enter_at_least_one_argument();
else
{
char *pointer;
pointer = string;
while (isspace((unsigned char) *pointer) != 0)
pointer++;
if (*pointer == ' ')
return please_enter_at_least_one_argument();
printf("%sn", string);
}
return 0;
}
解决了问题,简单易懂。
请注意,第一个please_enter_at_least_one_argument()
可能不正确,因为如果您按 Ctrl+D(或在 Windows 上按 Ctrl+Z)以及发生错误fgets()
可能会返回NULL
。但是要了解如何处理这个问题,您可能应该阅读 男人 fgets(3)
.