【问题标题】:Scanf with space in CC语言中带空格的scanf
【发布时间】:2019-02-13 14:20:25
【问题描述】:

我有这个结构:

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)。如下面的答案所述,标准库可能有办法获得您想要的行为。如果建议的答案对您的问题不起作用,您应该编辑问题以显示您提供的输入,以及您得到的令人惊讶的结果(与您的预期相比)。

标签: c input struct scanf space


【解决方案1】:

随便用

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

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

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

【讨论】:

  • 第二次调用setInput() 这种格式会引起麻烦。建议加空格:"%c %c %c" --> " %c %c %c".
  • @chux 好点。如果换行符(或其他 ws)没有在其他地方使用,那就是。
【解决方案2】:

您可以简单地在格式字符串中放置一个空格,从而跳过无限数量的空格:scanf("%c %c %c",&char1,&char2,&char3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多