在C语言中使用带空格的Scanf

3

我有这样的一个结构:

struct bye {
    char b;
    char y;
    char e;
}

我想用scanf读取一行包含3个字母的单词,但每个字母之间有同样数量的未知空格。

例如:"b[n 个空格]y[n 个空格]e" 然后输入:

struct bye word;

word.b = 'b'word.y = 'y'word.e = 'e'

我尝试了类似的操作,但是不起作用:

typedef struct bye bye_s; 

bye_s setInput() {
    bye_s ret;
    char current_char;

    scanf("%c", &current_char);
    ret.b = current_char;

    do {
        scanf("%c", &current_char);
    } while (current_char == ' ');
    ret.y = current_char;

    do {
        scanf("%c", &current_char);
    } while (current_char == ' ');
    ret.e = current_char;

    return ret;
}

当我只使用' '字符作为空格时,它对我有效。如果我混入\t\n,你的代码将无法处理,因为你正在与文字' '进行比较。(可以在ctype.h中查看isspace)。如下答案所述,标准库可能有获取您想要的行为的方法。如果建议的答案对您的问题无效,您应该编辑问题以显示您提供的输入以及令人惊讶的输出(与您预期的不同)。 - lockcmpxchg8b
2个回答

4

只需使用

if (scanf("%c %c %c", &ret.b, &ret.y, &ret.e) != 3) {
   /* failed */
}

在 scanf 格式中的任何空白都意味着跳过输入中的任何数量的空格。

并且永远不要忘记检查 scanf 的返回值!


1
在第二次调用 setInput() 时,这种格式会引起问题。建议添加一个空格:"%c %c %c" --> " %c %c %c" - chux - Reinstate Monica
@chux 很好的观点。如果换行符(或其他空格)没有在其他地方被消耗掉,那就是这样。 - Jens

1
您可以在格式字符串中放置一个空格,这样就可以跳过无限数量的空格:scanf("%c %c %c",&char1,&char2,&char3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接