亲爱的Stackoverflowers,
你如何处理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("%s\n", string);
} else {
printf("Please enter at least one argument.");
}
}
答案 0 :(得分:2)
引用C11
,章节§7.21.6.2,fscanf()
,关于%s
转换说明符,
s
匹配一系列非空白字符。
并且关于执行转换说明符的步骤
除非是跳过输入的空白字符(由
isspace
函数指定) 该规范包括[
,c
或n
说明符。
因此,除非输入流中存在非空白字符,否则它将等待。 匹配将不会发生。
此外,检查scanf()
和系列的返回值非常重要,以确保扫描成功。
尽管如此,int main()
至少应该int main(void)
符合标准。
答案 1 :(得分:1)
用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 argument\n");
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 == '\0')
return please_enter_at_least_one_argument();
printf("%s\n", string);
}
return 0;
}
解决问题并且很容易理解。
请注意,第一个please_enter_at_least_one_argument()
可能不正确,因为如果按 Ctrl + D ,fgets()
可能会返回NULL
(或在Windows Ctrl + Z )以及发生错误时。但要了解如何处理,您应该阅读man fgets(3)
。