zoukankan      html  css  js  c++  java
  • fgets读入一行字符串测试注意点

    安全的用法是:如果你一行至多有x个字符要读入,就用char s[x + 2];fgets(s, x + 2, stdin);这样保证读入的字符串不会被截断(截断是很危险的,不仅影响这一次的读入,还会影响后续的fgets的执行),如果输入K个字符,则s[0..K-1]是输入的字符串,s[K]='\n',s[K+1]='\0',调用printf("%s", s);将打印这一行所有的字符,外加一个换行符

    如果有类似scanf("%d", &n);后面紧跟着fgets(s, x + 2, stdin);——这个fgets将不会要求用户输入,而是直接读如输入缓冲区残留的'\n'

    如果有耐心,可以读读下面的注释,也可以自己用gdb调试,测试各种情况

    #include <stdio.h>
    int main()
    {
        char s[4];
        int n;
        //scanf("%d", &n);
        //fgets(s, 4, stdin);
        //
        //--in this case, you only need to input a number, s[0] = '\n', s[1] = '\0'
    
        //scanf("%d\n", &n);
        //fgets(s, 4, stdin);
        //
        //--in this case, you need to input 2 lines, a number, a string
        //if you input:
        //2
        //ab
        //s will be "ab\n"--s[3] = '\0'
    
        //if you input:
        //2
        //abc
        //s will be "abc"--s[3] = '\0'
    
        //if you input:
        //2
        //abcd
        //s will be "abc"--s[3] = '\0'
        
        //so, how to deal with that?
        //if there are at most x chars, you can use fgets(s, x + 2, stdin)
        //this will ensure there is '\n' and '\0'
    
        fgets(s,4,stdin);
        fgets(s,4,stdin);
        //if you input:
        //ab
        //--it will prompt you to enter another string
    
        //if you input:
        //abc
        //--you don't have the chance to input another string,
        //the later fgets will read remaining bytes from input buffer
        //so, the final s will be "\n",s[0]='\n',s[1]='\0',s[2]='c',s[3]='\0'
        
        //if you input:
        //abcd
        //finally you get s = "d\n",s[0]='d',s[1]='\n',s[2]='\0',s[3]='\0'
        return 0;
    }
  • 相关阅读:
    数据库(六):多表关系
    数据库(五):约束关系
    数据库(四):数据类型
    数据库(三):存储引擎
    数据库(二):初识sql语句
    数据库(一):初识数据库
    番外:socketserver用法
    ~~并发编程(十六):协程理论~~
    ~~并发编程(十五):进程池线程池~~
    ~~并发编程(十四):Queue~~
  • 原文地址:https://www.cnblogs.com/fstang/p/2793550.html
Copyright © 2011-2022 走看看