【问题标题】:Behavior of scanf when reading strings in C在 C 中读取字符串时 scanf 的行为
【发布时间】:2020-02-20 12:49:03
【问题描述】:

我想知道编译器在使用 scanf("%s") 时如何处理空格、换行符。我知道 scanf("%s") 不能读取空格和换行符。

例如如果我输入

hi          question

hi

        question

scanf("%s") 读取它没有问题。

下面是我所指的代码

#include <stdio.h>

int main () {
    char str [2][50];
    scanf("%s", str[0]);
    scanf("%s", str[1]);
    printf("%s\n", str[0]);
    printf("%s\n", str[1]);
    return 0;
}

【问题讨论】:

    标签: c string scanf buffer


    【解决方案1】:

    scanf 在线文档:

    空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格会验证从流中提取的任意数量的空格字符(包括无)。

    source

    【讨论】:

    • 所以在某种程度上 str[1] 的值暂时是一个空白字符,然后当它读取非空白字符时它会发生变化?
    • 那么这是否意味着scanf没有将空格放入数组中?
    • @Janjan,正确。空格根本不会写入数组。
    • 不过我还有一个问题。 get() 和 fgets() 的行为是否相似,唯一的区别是它读取空格和制表符并写入数组。虽然gets() 和fgets() 会忽略所有换行符,但这样正确吗?
    • @Janjan: gets(它不再是标准库的一部分,在任何情况下都不应使用)读取并丢弃下一个换行符。 fgets 最多读取 N 个字符或下一个换行符(以先到者为准)。如果它读取换行符,如果有空间,它将存储在目标缓冲区中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多