scanf()getchar()和gets()等函数的注意事项

合集下载

C语言中的输入输出函数总结

C语言中的输入输出函数总结

C语言中的输入输出函数总结1. scanf(函数:scanf(函数是C语言中用于从键盘输入数据的函数。

它可以根据格式字符串从键盘读取不同类型的数据,如整数、浮点数、字符等。

例如,scanf("%d", &num)将从键盘读取一个整数,并将其存储在变量num中。

2. printf(函数:printf(函数是C语言中用于将数据输出到屏幕上的函数。

它可以根据格式字符串将不同类型的数据以特定格式打印输出。

例如,printf("Hello, World!")将在屏幕上打印出"Hello, World!"。

3. gets(函数:gets(函数用于从键盘读取字符串。

它会一直读取字符,直到遇到换行符为止,并将字符串存储在给定的字符数组中。

要注意的是,gets(函数不会检查数组的大小,因此可能导致缓冲区溢出。

为了避免这种情况,最好使用fgets(函数。

4. fgets(函数:fgets(函数也用于从键盘读取字符串,但是它是安全的。

它会读取指定数量的字符,并将其存储在给定的字符数组中。

如果读取的字符数超过了数组的最大长度,多余的字符会被截断。

fgets(函数还会将换行符存储在字符串中,因此需要手动去掉换行符。

5. puts(函数:puts(函数用于将字符串输出到屏幕上,并自动在末尾添加一个换行符。

puts(函数仅适用于输出字符串,不适用于其他类型的数据。

6. putchar(函数:putchar(函数用于将单个字符输出到屏幕上。

它接受一个字符参数,并将其打印到屏幕上。

例如,putchar('A')将在屏幕上打印字母A。

7. getchar(函数:getchar(函数用于从键盘读取单个字符。

它会阻塞程序的执行,直到用户输入一个字符,并返回该字符。

8. sscanf(函数:sscanf(函数用于从一个字符串中读取数据。

它与scanf(函数的用法类似,但从字符串中读取数据而不是从键盘。

getch(),getche(),getchar(),gets(),scanf()的区别

getch(),getche(),getchar(),gets(),scanf()的区别

getch()和getchar()getchar()是C的标准库函数,包含在头文件<stdio.h> 中,而getch()和getche()需要的头文件是<conio.h>。

conio.h不是C标准库中的头文件。

conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作getcharThis is a standard function that gets a character from the stdin.getchThis is a nonstandard function that gets a character from keyboard, does not echo to screen.getcheThis is a nonstandard function that gets a character from the keyboard, echoes to screen.Use getchar if you want it to work on all compilers. Use getch or getche on a system that supports it when you want keyboard input without pressing [Enter].And note that the return value of all three is int! You need this to properly check for EOF.int getch( void ); Get a character from the console without echoint getchar ( void ); Get character from stdin, Returns the next character from the standard input (stdin).It is equivalent to getc with stdin as its argument可以看到,两个函数都没有参数,都是读入一个字符,返回值都是int型。

gets()的用法

gets()的用法

gets()的用法gets()是一个C语言函数,用于获取用户输入的字符串,其原型如下:char *gets(char *str);该函数用于从标准输入stdin中读取用户输入的字符串,并将读取的字符存储在指定的缓冲区str中,直到换行符或文件结束符EOF为止。

该函数将会在读取到换行符或文件结束符EOF时停止读取,并且会自动在字符串的结尾添加一个空字符'\0'。

使用gets()函数时需要注意以下几点:1.缓冲区越界问题:gets()函数没有任何限制,如果用户输入的字符串超过了缓冲区的长度,就会导致缓冲区溢出。

2.缓冲区未初始化问题:使用gets()函数读取字符串之前必须先对缓冲区进行初始化,否则会导致未定义的行为。

3.安全问题:gets()函数不进行任何安全检查,因此可以被用来进行缓冲区溢出攻击。

因此在实际的开发中不建议使用gets()函数,而是使用更安全的函数,如fgets()或者scanf()。

下面是使用gets()函数的示例代码:#include <stdio.h>{char str[20];printf("Please enter a string:\n");gets(str);printf("You entered: %s\n", str);return 0;}以上代码会提示用户输入一个字符串,并将用户输入的字符串打印输出。

gets()函数是一个可以用来读取用户输入的字符串的C语言函数。

但由于存在安全隐患,建议在实际的开发中使用更安全的函数,如fgets()或者scanf()。

因为gets()函数存在安全隐患,所以C语言提供了一些更安全的函数来读取用户输入的字符串。

1. fgets()函数fgets()函数用来从指定的流stdin中读取一行字符,并将这行字符保存在指定的字符串中。

它的原型如下:char *fgets(char *str, int n, FILE *stream);fgets()函数读取最多n-1个字符,直到读取到换行符或文件结束符EOF为止,然后停止读取,并将读取的字符存储在str中。

gets puts函数

gets puts函数

gets puts函数“gets”和“puts”函数是C语言里常用的输入输出函数,其名字分别代表“获取字符串”和“输出字符串”。

在本文中,我们将详细介绍这两个函数的用法、优缺点以及使用时需要注意的事项。

一、“gets”函数1.1 函数定义“gets”函数是C语言中输入函数库中的函数,其原型如下:char *gets(char *s);1.2 函数作用“gets”函数用于从标准输入读取一行字符串,每行字符串以’\n’(换行符)结束。

函数将读取的字符串存储在由参数s 指向的字符数组中。

1.3 优缺点优点:简单易用、内存占用小、可在程序中反复调用。

缺点:不安全、容易发生缓冲区溢出,因此被废弃,不推荐使用。

1.4 使用注意事项入的字符数组s 至少能存储字符串和结尾的‘\0’总共需要的存储空间。

(2)使用“gets”函数输入字符串时必须防止缓冲区溢出(buffer overflow)。

(3)如果需要输入多个字符串,不要使用“gets”函数,而要使用“fgets”函数。

(4)如果需要输入密码等敏感信息,建议使用“getch”或“getpass”函数,避免信息泄露。

二、“puts”函数2.1 函数定义“puts”函数是C语言中输出函数库中的函数,其原型如下:int puts(const char *s);2.2 函数作用“puts”函数用于向标准输出(stdout)输出一个字符串,输出的字符串以’\0’(空字符)结束,并自动换行。

2.3 优缺点优点:简单易用,便于调试和诊断程序。

缺点:输出效率低,输出大量数据时效率较低。

2.4 使用注意事项串必须以’\0’(空字符)结束。

否则会导致输出不完整。

(2)由于“puts”函数会自动在行尾添加换行符,因此输出含有多行信息时非常方便。

(3)如果需要输出格式化信息,应该使用“printf”函数。

三、示例代码以下是一个简单的示例程序,演示如何使用“gets”和“puts”函数读写字符串。

对于C语言中的scanf函数的使用问题总结

对于C语言中的scanf函数的使用问题总结

对于C语言中的scanf函数的小结对于scanf函数的作用大家应该都知道吧。

在任何一本C语言的教材中都有过介绍,它的一般形式是(格式控制,地址表列)我今天想说说使用这个scanf函数的时候,应该注意哪些问题吧。

1.scanf函数中的格式控制应该是变量名的地址,而不是变量名,例如a和b为整形变量,如果写成scanf(“%d%d”,a,b); 就会出错的,应该将这个,a,b改成&a,&b;(表示地址)2我们都知道C语言中的字符串是存放到字符数组中的,如果我们定义了一个字符数组,如char a[20];我们想把字符串输入到这个字符数组中通常有两种方式,第一种.逐个字符输入,采用for循环的形式。

第二种,直接输入字符串的形式,用格式控制符%s.第一种我们这样输入,for(i=0;i<=19;i++){Scanf(“%c”,&a[i]);}第二种我们用这种方式输入Scanf(“%s”,a);注意第二种这种形式,我们没有加&,这是为什么呢,这是因为,C语言中把这个数组名当做该数组的起始地址。

但是这种数组仅限于字符数组,不要企图,利用数值型数组的名。

来整体输入,一个数值型的数组,这就是大错误了,比如这样写是不正确的Int a[10];Scanf(“%d”,a);数值型数组的输入只能采用上面的第一种方法。

3对于指针问题,大家需要注意一点,指针就是地址,这是在任何条件下都成立的,(请允许我极端一点),比方看下面的例子。

Char *p;Char a[20];P=a;For(i=0;i<20;i++,p++){Scanf(“%c”,p);}这是一个采用指针变量输入数据的例子,这里的指针变量p 在for循环之前就指向了这个数组a,也就是指向了数组的首元素,也就是是说指针变量p里存放的是,数组首元素的地址,所以在用这个scanf函数进行输出时,指针变量的前方就不用再加取地址符号了。

scanf的正确使用及技巧

scanf的正确使用及技巧

scanf的正确使用及技巧scanf是C语言中常用的输入函数,它可以从标准输入设备(通常是键盘)读取数据,然后将数据存储到变量中。

scanf的使用非常灵活,但同时也存在一些需要注意的问题。

本文将介绍scanf的正确使用方法以及一些技巧,帮助读者更好地掌握这个函数。

一、基本使用方法scanf的基本语法如下:scanf('格式控制字符串', 变量1, 变量2, ...);其中,格式控制字符串是用来指定输入数据的类型和格式的字符串,变量1、变量2等是需要接收输入数据的变量。

例如,以下代码可以从键盘输入两个整数,并将它们存储到变量a和b中:```int a, b;scanf('%d%d', &a, &b);```在格式控制字符串中,'%d'表示输入的是一个整数,'%f'表示输入的是一个浮点数,'%c'表示输入的是一个字符,'%s'表示输入的是一个字符串,'%p'表示输入的是一个指针等。

在读取数据时,scanf 会根据格式控制字符串中的格式指定符逐个将数据读入到变量中,直到遇到空格、换行符或者文件结束符为止。

需要注意的是,在使用scanf读取字符串时,如果字符串中包含空格,则只会读取第一个单词。

例如,以下代码可以从键盘输入一个字符串,并将它存储到变量str中:```char str[100];scanf('%s', str);```如果输入的字符串是'Hello World',则只会将'Hello'存储到str中,而'World'会被忽略掉。

如果需要读取整个字符串,可以使用fgets函数。

二、输入错误处理scanf函数在读取数据时,如果输入的数据格式与格式控制字符串中指定的格式不符,就会出现输入错误。

例如,如果格式控制字符串中指定的是'%d',但输入的是一个字符,则会出现输入错误。

C语言 中scanf详解

C语言 中scanf详解

C 中scanf ( ) 函数用法心得我觉得,在输入输出函数中,scanf()函数,应该是最麻烦的,有时它给我们的结果很可笑,但是一定是一原因的....首先声明一下,这篇日志不是介绍scanf()中各种格式符用法的文章(没有这个必要,但是大家一定要会用).我尝试了很多种输入,包括一些错误的练习,曾经对scanf()由迷茫转向清醒,又由清醒再次转向迷茫......不知道何时是个尽头,谁让C如此高深呢?在这里贴出来,也是想让自己时而不时能看到,也想知道自己的理解是否有错,错在哪里(所以我就厚着脸皮,放在上面了).注意, 键盘缓冲区与输入有着密切的关系,并且, 类型匹配对输入也极为重要!!下面进入主题:scanf对流的操作遵从类型匹配操作原则,如果类型不匹配,它将不读取输入流。

因此输入流将滞留,如果输入流不空,scanf不会等待用户输入,直接从缓冲区中输入. 但是,scanf() 怎样匹配? stdin又是什么?在网上搜到的关于匹配的非常少,有些细节原因还是找不到.所以,我自作主张的下了点结论:例: scanf("%d,%d",&i,&j); 输入:12 ,13回车但是,j!=13. //注意,12后有一个空格,why?原因:我解释为,在scanf()中,格式字符串中普通字符(不包括空白字符)实行的是严格匹配,因为格式串中%d后面是一个 ',' ,因此输入中数字12后必须为一个','.scanf("1123%s",&str); 输入:1123aaabb 时str为aaabb,但是,输入24aabbdd时, 会出错,因为1123必须进行严格匹配.另外: scanf("%d\n",&i); printf("i=%d",i); 要怎么输入才能输出:i=12 ? 它不是你想像中的那样,有机会尝试一下吧!一些样例:scanf()是一个有返回值的函数,它的返回值是什么?怎么样利用这个特性?scanf()中的匹配原则: 在本文第五点具体说明...scanf()中各种数据格式匹配的开始条件,结束条件 .如: %d ,\n等类型输入结束条件.scanf("%d\n",&i);printf("%d",i); 输入 12回车,并无输出,why? scanf()函数的结束条件: 当各个格式符匹配完毕,且最后有一个回车时,函数结束. scanf("%s",str)连续输入127个就不能继续输入了. //TC中,VC好像是4000多..//说明键盘缓冲区长度为一个字节吗?但是 stdin->bsize(缓冲区大小)事实上为512,这又是为什么?stdin缓冲区中的数据残留 : scanf("%3s",str); c= getchar(); 输入: aaabbccc回车, 此时str="aaa",c='b'; //缓冲区中数据残留!getch()不经过缓冲区,直接接收键盘上输入的字符.//在上例中,加上一个 ch=getch(); 但是getch()并不能读取bbccc中的任何一个,说明getch()与getchar()并不一样,并且它们对Enter读取的值也不同! 一个不常用的格式符: %[] ,如 scanf("%[a-z]",str);输入: abcdefdsaABCDEF 输出:str="abcdefdsa" ;怎么用scanf()来输入一个有空格的字符串?scanf()处理时,一个Enter送到缓冲区中有两个值 : 一个回车(10) ,一个换行(13). 可以用getchar()来接收(但是,在只能接收到\n,即13).在一个scanf()函数之后加个fflush(stdin)可以清除输入数据残留?scanf("%3s",str); fflush(stdin); c=getchar();直接输入aaabbbddd回车, c还能取得值吗?下面是详细解释:scanf()函数执行成功时的返回值是成功读取的变量数 , 也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。

C语言中scanf函数与空格回车的用法说明

C语言中scanf函数与空格回车的用法说明

C语⾔中scanf函数与空格回车的⽤法说明众所周知,C语⾔中的scanf函数的作⽤是从标准输⼊设备(通常是键盘)读取输⼊值,并存储到参数列表中指针所指向的内存单元。

下⾯从⼏个⽅⾯说⼀下⼀些稍微细节的东西。

下⾯的实验都在vc6.0中通过。

1、scanf的返回值scanf通常返回的是成功赋值(从标准输⼊设备赋值到参数列表所指定的内存区域)的数据项数,如果出错或是遇到end offile(注意,如果想从键盘输⼊EOF,在windows的DOS窗⼝⽤Ctrl+Z 或F6;在UNIX系统上,⽤CTRL+D。

),则返回EOF,⽐如:scanf("%d%d", &x, &y);如果x和y都被成功读⼊,那么scanf的返回值就是2;如果只有x被成功读⼊,返回值为1;如果x和y都未被成功读⼊,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。

2、scanf的处理机制scanf以删除的⽅式从缓冲区读⼊数据(来⾃标准输⼊设备的数据存储在缓冲区),也就是说,scanf从缓冲区读⼊⼀个数据项,该数据项在缓冲区中就被清除掉了。

⽽如果scanf需要读取⼀个数据项,返现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待⽤户输⼊,scanf函数接收到相应的数据项之后,在缓冲区中将这⼀数据项清除,scanf函数返回,程序继续执⾏。

3、scanf对不同类型输⼊的处理⽅式⾸先,要清除⼀个概念:空⽩字符(white space)。

⼀般,程序中所指的空⽩字符是指空格(space),回车(enter)和指标符(table)。

3.1 整数%d对于整型数据的输⼊,也就是说"%d"类型的输⼊,scanf默认的分割符是所有的空⽩字符(空格,回车和指标符都⾏)。

也就是说如果⼀个scanf函数中出现scanf("%d%d",&a,&b),那么⽤任何⼀个空⽩字符来分隔两个整数a,b的值,变量a,b都可以接收到正确的输⼊。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

-------------------------------------------------------------------
| 问题描述一:(分析scanf()和getchar()读取字符)|
-------------------------------------------------------------------
scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。

但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。

下面先看一个很简单的程序:
程序1:
#include <stdio.h>
int main()
{
char ch1, ch2;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%d %d\n", ch1, ch2);
return 0;
}
或者是:
#include <stdio.h>
int main()
{
char ch1, ch2;
ch1 = getchar();
ch2 = getchar();
printf("%d %d\n", ch1, ch2);
return 0;
}
程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。

可是执行程序后会发现除了问题:当从键盘输入一个字符后按下回车准备输入第二个字符时,就打印出了结果,根本就没有输入第二个字符程序就结束了。

例如用户输入字符'a'回车, 打印结果是97,10(回车)。

输入字符'a'-空格-‘b’,结果为97 32也就是说ch2接收的是空格而不是’b’。

这是为什么呢?
【分析】:
首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。

一次输入过程是这样的,当一次键盘输入结束时(按下回车键)会将输入的数据全部存入输入缓冲区(包括空格和回车),而输入函数直接从输入缓冲区中取数据。

正因为输入函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,输入函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!
其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。

而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样
第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!当输入'a'-空格-‘b’-回车,输入回车之后一次输入结束,输入缓冲区中的内容为:‘a’空格‘b’回车。

输入函数读取a之后,发现输入缓冲区中还有数据,则不会再从键盘输入,而是直接从输入缓冲区中再读一个字符,发现是空格,所以前后两次打印为97 32.
----------------------------------------------------
| 问题描述二:(分析scanf()和gets()读取字符串)|
----------------------------------------------------
首先我们看一下scanf()读取字符串的问题:
程序2:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
scanf("%s",str1);
printf("%s\n",str1);
scanf("%s",str2);
printf("%s\n",str2);
return 0;
}
程序的功能是读入一个字符串输出,在读入一个字符串输出。

可我们会发现输入的字符串中不能出现空格,例如:
Hello world!
Hello
world!
【分析】到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello world!后,字符串Hello world!都会被读到输入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,也就是第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

测试二:
Hello[Enter]
Hello[输出]
world[Enter]
world[输出]
【分析】程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()连续读取字符串会舍弃最后的回车符!
我们再看一下gets()读取字符串的情况:
用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。

其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下:
程序3:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
gets(str1);
printf("%s\n",str1);
gets(str2);
printf("%s\n",str2);
return 0;
}
测试:
Hello world! [输入]
Hello world! [输出]
12345 [输入]
12345 [输出]
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从
键盘的读入,而且第一个字符串取了Hello world! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!
--------------------------------------------------------
-------------------
| 【总结】 |
-------------------
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()和getchar()以Enter结束一次输入,不会舍弃空格和最后的回车符(即空格和回车符会残留在缓冲区中);
读取字符串时:
scanf()以Enter结束输入,舍弃最后的回车符,但是不能忽略空格。

gets()则忽略空格,所以读取字符串时尽量使用gets()。

第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就
没问题了!
这个函数是fflush(stdin)。

相关文档
最新文档