【发布时间】:2016-08-08 05:04:53
【问题描述】:
看起来 scanf() 正在读取前一个 '\n'。我正在尝试将我的连接字符串放在一行上。如何摆脱第二个字符串开头的 '\n' 。
这是一个 c 程序。
我猜我必须在读入下一行之前以某种方式刷新缓冲区。但我不知道如何在没有错误的情况下执行此操作。
顺便说一句,我不能在这里使用 cin.get() 或其他标准 cin/cout 操作。我也不能使用标准的字符串操作,因为我只使用 c-strings 和 strings.h,而不是 string。
来自标准输入的输入是:
12
4.0
Spot run!
int main() {
int i = 4;
double d = 4.0;
char s[] = "See ";
int isum;
int MAX_SIZE = 256;
double dsum;
char s2[MAX_SIZE];
scanf("%i",&isum);
scanf("%lf",&dsum); // Hope to clear out the newline from reading
// in the double value. Or any other newline
// before the next scarf(), but haven't figured
// how.
scanf("%79c", s2);
isum += i;
printf("%d \n",isum);
dsum += d;
printf("%.1f \n",dsum);
char newchar[MAX_SIZE];
strcpy(newchar,s);
newchar[strcspn(newchar,"\n")]='\0';
s2[strcspn(s2,"\n")] = 't'; //To test where newline is in second string.
strcat(newchar,s2);
printf("%s",newchar);
return 0;
我的输出是:
16
8.0
See
tSpot run! //
【问题讨论】:
-
你确定你在学习C++吗?这看起来像一个 C 程序。
-
你说得对,我会改正的。我从一群仍然使用 c 风格习惯的老 C 程序员那里学习了 C++,所以我没有立即学习。我会更正标签。
-
"*看起来 scanf() 正在读取前一个 '\n'。*" 你觉得这很奇怪吗?如果是这样,你认为会读到什么?
-
我确实觉得这很令人惊讶,我认为它会开始读取下一行,而不是上一行中的 '\n'。我怎样才能让它不读?
-
关于
scanf()及其亲属的行为有很多问题,它们是标准C 库中一些最微妙和最复杂的函数。当下一个字符不是数字的一部分时,转换规范(例如%lf)会停止读取——让该字符由下一个转换规范处理。请注意%c(连同%[…]扫描集和%n)不会跳过前导空格;所有其他转换规范都会跳过前导空格。如果您不希望数字输入留下换行符,请使用" %79c"跳过任何空格。
标签: c printf scanf stdin c-strings