【问题标题】:What is the difference between scanf("%[^\n]*c", sen); and scanf(" %[^\n]*c", sen); 2nd one is giving correct resultscanf("%[^\n]*c", sen); 有什么区别?和 scanf(" %[^\n]*c", sen);第二个给出正确的结果
【发布时间】:2021-07-30 07:24:39
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() 
{
    char ch, s[100], sen[100];
    scanf("%c", &ch);
    scanf("%s", s);
    scanf("%[^\n]*c", sen);
    printf("%c\n%s\n%s", ch, s, sen);
    return 0;
}

在执行时,在打印sen 之前有空间。而当在scanf 中在%[^\n]*c 之前放置空格时,那里没有所需的空格。为什么?

【问题讨论】:

    标签: c printf scanf


    【解决方案1】:

    "%[..]" 转换说明符不会丢弃前导空格(例如 ' ' 空格、'\t' 制表符、'\n' 换行符(和其他))。因此,如果您需要使用前导空格,则必须在其前面手动插入 ' ' 空格。 ("%c""%n" 同样不使用前导空格,.. 所有其他转换说明符都这样做)

    因此,例如,如果使用"%s" 的先前转换使stdin 中的'\n' 字符未读(确实如此),那么使用scanf("%[^\n]*c", sen); 将无法读取任何内容,因为它会看到留下的'\n' "%s"。在它之前添加空格会导致'\n' 被丢弃,因此您将读取到下一个'\n'sen。见man 3 scanf

    【讨论】:

    • 请注意,格式字符串末尾的*c 是无用的,要么应该删除(我的偏好),要么更改为%*c(OP 可能打算这样做)。跨度>
    • 很好,我读到了%*c我已经看过很多次了...:)
    • 那么这里发生了什么?为什么它没有显示正确的结果? @DavidC.Rankin #include #include #include int main() { char ch, s[100], sen[100]; scanf("%c", &ch); scanf("%[^\n]*c", s); scanf("%[^\n]*c", sen); printf("%c\n%s\n%s", ch, s, sen);返回0; }
    • @RaghavSharma 当您调用canf("%c", &amp;ch); 时,会从stdin 中读取一个字符,所有其他字符都将保留。当您调用scanf("%s", s); 时,读取到非空白字符之后的下一个空白的所有字符都留下空白(如果该行只有一个单词,则为'\n')。当您调用 scanf("%[^\n]*c", sen); 时,'\n' 字符是在 stdin 中等待的第一个字符,因此调用读取的内容不会在第一个 '\n' 处停止(恰好是第一个字符 - 所以什么都没有读取) .当您在其前面添加' ' 时,'\n' 将被丢弃。
    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2011-08-30
    • 2015-07-15
    • 2021-04-02
    • 2012-10-27
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多