我想通过使用获取一个字符串作为输入scanf
,如果该字符串只是一个空格或空白,我必须打印错误消息。
这是我试图做的:
char string1[20]
scanf("%s",string1)
if(string1=='')
print error message
但这不起作用,实际上我没想到它会起作用,因为它string1
是一个字符数组。
任何提示如何做到这一点?
我想通过使用获取一个字符串作为输入scanf
,如果该字符串只是一个空格或空白,我必须打印错误消息。
这是我试图做的:
char string1[20]
scanf("%s",string1)
if(string1=='')
print error message
但这不起作用,实际上我没想到它会起作用,因为它string1
是一个字符数组。
任何提示如何做到这一点?
您应该注意,该scanf
函数永远不会扫描其中只有空格的字符串。而是检查函数的返回值,如果它(在你的情况下)小于一个它无法读取字符串。
您可能想使用fgets
读取一行,删除尾随换行符,然后检查字符串中的每个字符是否为空格(使用isspace
函数)。
像这样:
char string1[20];
if (fgets(string1, sizeof(string1), stdin) != NULL)
{
/* Remove the trailing newline left by the `fgets` function */
/* This is done by changing the last character (which is the newline)
* to the string terminator character
*/
string1[strlen(string1) - 1] = '\0';
/* Now "remove" leading whitespace */
for (char *ptr = string1; *ptr != '\0' && isspace(*ptr); ++ptr)
;
/* After the above loop, `*ptr` will either be the string terminator,
* in which case the string was all blanks, or else `ptr` will be
* pointing to the actual text
*/
if (*ptr == '\0')
{
/* Error, string was empty */
}
else
{
/* Success, `ptr` points to the input */
/* Note: The string may contain trailing whitespace */
}
}
scanf()
并不总是跳过前导空格。
选择格式指定如“ %s
”、“ %d
”、“ %f
”跳过前导空格。(空白)。
其他格式指定如“ ”、“ ”、“ ”不要跳过跳过前导空格。%c
%[]
%n
排队扫描并寻找空格。(string1 可能包含空格)
char string1[20];
// Scan in up to 19 non-LineFeed chars, then the next char (assumed \n)
int result = scanf("%19[^\n]%*c", string1);
if (result < 0) handle_IOError_or_EOF();
else if (result == 0) handle_nothing_entered();
else {
const char *p = string1;
while (isspace(*p)) p++;
if (*p == '\0')
print error message
}
首先,如果您在格式说明符之前放置一个空格(或其他空格字符,如or ),scanf
则将跳过任何空格,如'\n'
'\t'
scanf(" %s", &str)
其次,if(string1=='')
将 char 指针与永远不会为真的string1
空白 char''
进行比较,因为现有变量的地址将是非 NULL。也就是说,在 C 中没有像这样的“空白”字符。您需要获取行输入并解析它是空行还是仅包含空格''