新行后Scanf函数停止并只读取输入的一小部分(应忽略换行符和制表符)

问题描述 投票:0回答:2

整个问题的简短版本:

我想加载这个输入

4
     CAAC

      28    EAAEB5
  F489AD95

但我能从中获得的是:

4                                                                                                                                                                                           

我试图从输入这些参数:4 CAAC 28 EAAEB5 F489AD95

---------------详细说明我的代码---------------------------

我是C语言的新手,我正在尝试做一个输入,作为一个字符串并使用它后...我有一个问题来处理"Whitespaces",如["\n""\t"" "]这是一个输入我给了我的编译器:

4
     CAAC

      28    EAAEB5
  F489AD95

有一堆空格,制表符等。我想要做的是,阅读它并替换\ n和\ t(在clode下我试图忽略它,因为在scanf()之后发现\ n它跳过其余部分。

这是我现在尝试的代码之一:

#include <stdio.h>

int main()
{
    int number;
    char chr[200];

    // %d -> I know that there should be number at the beginning, so until character / space appears, I want to read the number.
    // scanf("%d", &number);

    // ignores \n and \t and then puts it in chr
    scanf(" %[^\t\n]s", &chr);

    // last should be \n so this is just acheck if there is ( its gonna be in if later )
    scanf("%c");

    printf("\n %s", chr);
    printf("\n Heythere");

    return 0;
}

这是我得到的输出:

4                                                                                                                                                                                           
 Heythere 

我一直在考虑把它放在一个循环中,但问题是,最后一个字符是“\ n”并且它可以在给定的字符串中出现多次。

我目前正在尝试找到scanf()的最佳选项来读取这些行并忽略新行

/////////

换一种说法 :

我试图从输入这些参数:4 CAAC 28 EAAEB5 F489AD95

知道如何解决它,能够完全缓冲它吗? (也是最好的答案,将帮助我,将是一个,将用一个单独的“\ n”替换那些“\ n”和“\ t”(空格)提前感谢您的答案(如果真的很简单也很抱歉并回答了几百万次...我被困在这里一个星期)

c string char int scanf
2个回答
1
投票

从表面上看,您只需要一个循环来读取五个字符串:

char data[5][100];
int i;

for (i = 0; i < 5; i++)
{
    if (scanf("%99s", data[i]) != 1)
    {
        fprintf(stderr, "Unexpected input failure (i = %d)\n", i);
        exit(EXIT_FAILURE);
    }
}

现在数组的元素将包含您提供的5个字符串('words')。

根据设计,scanf()函数在很大程度上忽略了空格,除了它分隔字符串或数字的程度。除了三个转换说明符外,所有转换说明符都超过了前导空格 - 例外是%c%[…](扫描集)和%n

%99s转换规范跳过前导空格(空格,制表符,换行符),最多消耗99个不是空格的字符,并停在第一个空白区域(或当字符串已满时),留下空白区域如果字符串未满,则由下一个输入处理的输入流。

显然,如果你不知道有五个字符串要读,你必须努力工作 - 但基本的想法是一样的。

如果您想保存或更改换行符,选项卡,空格,那么scanf()不是正确的工具。它并不关心白色空间而你会这样做 - 这不会带来幸福。然后使用fgets()或POSIX getline()读取输入行,您可以根据需要处理空白,制表符和换行符。


3
投票

你有几个选择:

  • 使用IS中的官方讨论主题
  • 在他们的时间问任何顾问
  • 或者,如果你不能来,请再问他们一次
  • 给任何顾问写一封电子邮件

My feelings about this post

© www.soinside.com 2019 - 2024. All rights reserved.