美文网首页
「C」char * s_gets(char *st,int n)

「C」char * s_gets(char *st,int n)

作者: 叨码 | 来源:发表于2019-06-18 01:16 被阅读0次
//拼接两个字符串
#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’) ;来清除缓存中的垃圾数据。

现在是明白了,但就怕过几天忘却。。。所以记录下,以备温故

相关文章

网友评论

      本文标题:「C」char * s_gets(char *st,int n)

      本文链接:https://www.haomeiwen.com/subject/qvgtqctx.html