scanf,fgets,gets的用法及注意事项!如何才能实现带空格的输入数据

时间:2021-12-16 01:47:39

scanf 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

第一个参数指定输入的格式(%c——字符,%s——字符串,%d——十进制整型数,%p——指针值(内存地址),%x——十六进制整数)

第二个参数是将从键盘输入的数据存放在的已定义的对应变量中,变量名前需加上取地址符 &(只有一个例外:字符数组变量不用加 &),否则会有段错误。

例子:int count;scanf("%d",  &count);

scanf在往字符数组内输入数据时会存在溢出现象,造成段错误。

像上面例子里的写法,scanf在读取键盘输入时,遇到空格和回车符时会结束读取,完成存放数据操作;按完回车后,回车符会存在缓冲区中,所以只能实现一次读取(已回车为结束标志),多次操作可以如下方式实现:

int a, b, c;scanf("%d%d%d", &a, &b, &c);或者scanf("%d,%d,%d", &a, &b, &c)(ps:键盘输入时,两个数据间也要加上,以作区分)

实现多次输入时字符时,scanf会将回车符当成第二个字符输入,第二个字符变量并不能被赋值,解决方法:

        char a;
char b;
scanf ("%c",  &a);
while (  scanf  ("%c",  &b)  !=  '\n')
{
scanf("%c",&b);
break;
}

putchar(a);

putchar(b);

也可以用getchar()来吃掉缓冲区的回车符

如果希望scanf可以实现带空格的输入,可用char str[100];;scanf (" %[^\n] ", str );

gets

gets()函数和scanf一样可以从键盘获取字符串,但是gets函数只认为回车是输入结束标志,空格不会作为结束标志

gets不能用类似“%s或者%d”之类的字符转义,只能接受字符串的输入

char s[100] = { 0 };

    gets(s);//gets认为回车输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串

    //gets和scanf一样存在缓冲区溢出的问题

    int i;

    for (i = 0; i < 10; i++)

    {

        printf("%d\n", s[i]);

    }

    printf("----------------------------------\n");

    printf("%s\n", s);

fgets

gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。

由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便,fgets已回车符结尾。

char s[10] = {0};

// 第一个参数是char的数组,第二个参数是数组的大小,单位:字节,

// 第三个参数stdin代表标准输入的意思

// fgets是安全的,不存在缓冲区溢出的问题,只要保证第二个参数小于等于数组实际的大小,就能避免缓冲区溢出问题

// fgets会将回车键读到数组里

fgets(s, sizeof(s)/sizeof(char), stdin);

printf ("%s\n", s);