1

我想通过使用获取一个字符串作为输入scanf,如果该字符串只是一个空格或空白,我必须打印错误消息。

这是我试图做的:

char string1[20]
scanf("%s",string1)
if(string1=='')
   print error message

但这不起作用,实际上我没想到它会起作用,因为它string1是一个字符数组。

任何提示如何做到这一点?

4

3 回答 3

5

您应该注意,该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 */
    }
}
于 2013-11-04T12:13:54.070 回答
1

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
}
于 2013-11-04T22:11:27.327 回答
0

首先,如果您在格式说明符之前放置一个空格(或其他空格字符,如or ),scanf则将跳过任何空格,如'\n''\t'scanf(" %s", &str)

其次,if(string1=='')将 char 指针与永远不会为真的string1空白 char''进行比较,因为现有变量的地址将是非 NULL。也就是说,在 C 中没有像这样的“空白”字符。您需要获取行输入并解析它是空行还是仅包含空格''

于 2013-11-04T12:30:44.687 回答