整个问题的简短版本:
我想加载这个输入
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”(空格)提前感谢您的答案(如果真的很简单也很抱歉并回答了几百万次...我被困在这里一个星期)
从表面上看,您只需要一个循环来读取五个字符串:
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()
读取输入行,您可以根据需要处理空白,制表符和换行符。