0%

C语言获取一行输入

最近在重新学习C语言时,发现scanf()函数使用%s或%c获取一行输入时会在空格处截断,在网上查了些资料后找到了几个解决办法

  1. scanf()函数

    原型

    1
    2
    # include <stdio.h>
    int scanf(const char * restrict format,...);

    用法

    scanf()函数使用在获取输入的时候会在空格处截断,使用

    1
    scanf("%[^\n]", &str);

    即可获取一行输入

  2. gets()函数

    原型

    1
    2
    # include <stdio.h>
    char *gets(char *str);

    用法

    1
    gets(str);

    gets()函数也可以获取一行内容

    gets()函数从标准输入读入一行文本,直到读到新行符或EOF字符之前,不会停止读入文本。

    也就是:gets()不检查边界。因此,当变量空间小于一行字符串时,使用gets()会造成溢出,程序出错。

    所以应少用或不使用此函数

  3. gets_s()函数

    原型

    1
    2
    # include <stdio.h>
    char *gets_s(char *buffer, size_t sizeInCharacters);

    用法

    1
    gets_s(str, SIZE);

    gets_s()函数用法与gets()函数基本一致,但多了一个参数,使得程序更加安全

  4. fgets()函数

    原型

    1
    2
    # include <stdio.h>
    char *fgets(char *s, int size, FILE *stream);

    用法

    1
    fgets(str, SIZE, stdin);

    fgets() 虽然比 gets() 安全,但安全是要付出代价的,代价就是它的使用比 gets() 要麻烦一点,有三个参数。它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。

  5. 自定义

    详见《C Primer Plus (中文版)第6版》P331-P334

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    char *s_gets(char *st,int n)
    {
    char *ret_val;
    int i = 0;

    ret_val = fgets(st, n, stdin);
    if(ret_val){ //与*ret_val!='\0'相同,当ret_val指向空字符时,ret_val的值是0,即测试条件为假,while循环结束
    while(st[i] != '\n' && st[i] != '\0')
    i++;
    if(st[i] == '\n')
    st[i] = '\0';
    else //如果检测到结束标志'\0',则读取但不储存输入,包括\n。
    //丢弃的目的,不让多出来的留在缓冲区,保证了读取语句与键盘输入同步
    while(getchar() != '\n')
    continue;
    }
    return ret_val;
    }