C/C++ scanf和gets 区别

ref https://www.cnblogs.com/hlongch/p/5742477.html

scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢?

scanf 留回车:开头忽略所有空格,以空格、制表符Tab(\r)、换行符(\n)等结束,结尾自动加上‘\0‘,并且这些字符会留在缓冲区中;

gets 吃回车:开头接受任何字符,以换行符结束,并且会用‘\0‘ 替换换行符作为字符串结尾。

相同点:字符串结尾自动加‘\0‘

scanf和gets搭配混用时,需要注意是否接收空格、Tab、换行等特殊字符。

比如,为避免在scanf之后,出现输入的换行被scanf忽略,但是会被gets接收的问题,可以在gets前添加一个getchar,用于专门接收缓冲区的换行字符

int main()
{
    int n;
    char b[200];

    scanf("%d", &n); // 输入n

    getchar();  //scanf 之后, gets之前需要添加一个getchar , 否则下一个gets会将输入的回车作为b的新输入
    gets(b);
}

原文地址:https://www.cnblogs.com/fortunely/p/10347225.html

时间: 2024-10-11 10:00:06

C/C++ scanf和gets 区别的相关文章

cin与getchar、scanf之间的区别

cin会忽略空格和回车 getchar与scanf不会忽略回车和空格 // exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; int main(void) { char ch; ch=getchar(); printf("%d\n",ch); cin>>ch; printf("%d\n",ch

getchar() 和 scanf(&quot;%c&quot;)的区别

getchar()和scanf("%c")的功能都是从STDIN读一个字符,单论功能两者没有区别. 但两者的返回值是有区别的: ------------------------------------------------ scanf()的详尽介绍请移步这里. ------------------------------------------------- scanf()的返回值的含义是: On success, the function returns the number of

scanf gets fgets区别与联系

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用__gets__函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,应该使用gets输入.

【C语言】gets()和scanf()函数的区别

scanf函数与gets函数 scanf函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets函数. gets可以接收空格:而scanf遇到空格.回车和Tab键都会认为输入结束,所有它不能接收空格. char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s",string); /*遇到空格认为输入结束*/ 所以在输入的字符串中包含空格时,应该使

C语言学习---day1(字符串数组,指针)

C语言中没有和JAVA中一样的String类型,因此,在C语言中,通过使用字符数组来保存字符串,为了和普通的字符数组区分,我们需要在字符串的尾部添加 一个结束标志:'\0',因此,例如字符串:"bht",那么保存这个字符串的字符数组长度为4. 字符串的初始化: 1 char a[4]={'b','b','t','\0'}; 2 3 char b[4]; 4 b[0]='b'; 5 b[1]='h'....... 6 7 char c[]="bht"; 如果使用第7行

C语言(一)基础知识要点

一.C语言数据类型 1.数据类型 2.数据修饰符 数值类型的数据前面,还可以添加修饰符,用来改变数据类型的容量. long:长型符 short:短型符 signed:有符号位 unsigned:无符号位 二.编译和运行指令 编译环境为:WinGW 配置环境变量:path后添加D:\MinGW\bin 进入.c文件所在目录 编译:gcc -c example.cpp 连接:gcc example.o 编译并连接:gcc example.cpp -g -o example.exe 运行:exampl

c语言各类问题 代码

定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#include<stdio.h>struct d{int x;char y;};int main(void){struct d a[5];int i,d;int b[6]; for(i=0;i<5;i++){scanf("%d%c",&a[i].x,&a[i].y);

《Java程序设计》第7周学习总结

20175221   <Java程序设计>第7周学习总结 教材学习内容总结 第八章:常用实用类 String类: String对象 常量对象 创建对象 并置字符串:使用“+”对String对象进行并置运算,首尾相接得到一个新的String对象 引用String类的常用方法: 1.public int length( ) :获取一个String对象的字符序列长度 2.public boolean equals(String s):比较当前String对象与参数s的字符序列是否相同 3.publi

【fzoj 2376】「POJ2503」Babelfish

FZOJ题目链接 题目很简单,但是读入是一个难点. 于是我选择了sscanf sscanf sscanf与scanf略有区别. sscanf函数原型如下 int __cdecl sscanf(const char * restrict _Src,const char * restrict _Format,...) 说的直白点,sscanf需要写数据来源,而scanf不需要 例如 sscanf(x,"%s%s",a,b);对比scanf 就多了一个数据来源 其他点 map即使是strin