【问题标题】:How to read white spaces with scanf如何使用 scanf 读取空格
【发布时间】:2023-03-31 23:10:01
【问题描述】:

即使我在scanf("[^\n]s", x)"%34[^\n]"%127s 中使用此条件,我也无法正确获得答案。 scanf 区域或其他部分是否有任何问题......

#include <stdio.h>

int main() 
{
    int i = 4;
    double d = 4.0;
    char s[] = "hello ";
    int a;
    double b;
    unsigned char string_2[100];
    scanf("%d",&a);
    scanf("%lf",&b);
    scanf("%[^\n]s",string_2);
    printf("%d",a+i);
    printf("\n%lf",d+b);
    printf("\n%s",s);
    printf("%s",string_2);
    return(0);
}

【问题讨论】:

  • scanf("%lf",&amp;b); scanf("%[^\n]s",string_2); --> scanf("%lf",&amp;b);while(getchar()!='\n'); scanf("%99[^\n]",string_2);
  • 是的,这确实有效……太棒了.......

标签: c whitespace scanf space backspace


【解决方案1】:

不要这样使用scanf

在这个:

scanf("%lf",&b);
scanf("%[^\n]s",string_2);

第一个scanf 从输入中读取一个数字,但必须先等待您的终端为程序提供完整的输入行。假设用户123,所以程序从操作系统读取123\n

scanf 看到不再是数字一部分的换行符,并在输入缓冲区(在 stdio 内)中留下换行符。第二个scanf 尝试读取不是换行符的内容,但不能这样做,因为它看到的第一件事是换行符。如果您检查 scanf 调用的返回值,您会看到第二个 scanf 返回零,即它无法完成您要求的转换。

改为一次读取整行,使用fgetsgetline

#include <stdio.h>
int main(void)
{
    char *buf = NULL;
    size_t n = 0;
    double f;
    getline(&buf, &n, stdin);
    if (sscanf(buf, "%lf", &f) == 1) {
        printf("you gave the number %lf\n", f);
    }
    getline(&buf, &n, stdin);
    printf("you entered the string: %s\n", buf);
    return 0;
}  

更多讨论请见:http://c-faq.com/stdio/scanfprobs.html

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多