//拼接两个字符串
#include<stdio.h>
#include<string.h>
#define SIZE 80
char * s_gets(char *st,int n);
int main(void){
char flower[SIZE];
char addon[] = "s smell like old shoes\n";
puts("Where is your favorite flower?");
if (s_gets(flower,SIZE)){
strcat(flower,addon);
puts(flower);
puts(addon);
}else{
puts("End of file encountered!");
}
puts("bye");
return 0;
}
char * s_gets(char * st,int n){
char * ret_val;
int i=0;
ret_val = fgets(st,n,stdin);
if(ret_val){
while(st[i] !='\n' && st[i] !='\0'){
i++;
}
if(st[i] =='\n'){
st[i] = '\0';
}else {
while(getchar()!='\n'){
continue;
}
}
}
return ret_val;
}
看到此程序,对
while(getchar()!='\n'){
continue;
}
一时没绕过弯儿来,倒是明白continue是作用于最近的循环,也就是作用于while(getchar()!='\n') 但至于作用一时没弄明白,感觉就是在空跑一个循环,打了日志,也没发现运行到这里,难道没用?
既然写了,肯定是有一定作用的吧,尝试将
define SIZE 80 改为 #define SIZE 5 后 重新输入了一串长度大于5的字符串 就能看出端倪:
Where is your favorite flower?
wonderflower
wonds smell like old shoes
ll like old shoes
bye
输入的字符其实只是打印size长度的部分,后续输入的并没有打印,这也是符合程序原意的,但为什么要在后边“多次一举”呢。
度娘了下,找到了答案:https://blog.csdn.net/qq_43577069/article/details/88836710
划重点:
在输入一个数据时,一般都会按回车来确认输入结束,可是scanf()函数对最后的回车确认符并不丢弃,而是存储在** 缓存 ** 中,这样如果,下一个操作是读字符操作,则会将缓存中的回车符误读为实际数据,而造成程序运行异常。因此,在确认输入一个数据后,要回车来确认时,可通过while (getchar()!=’\n’) ;来清除缓存中的垃圾数据。
现在是明白了,但就怕过几天忘却。。。所以记录下,以备温故
网友评论