两者之间有着显著的差异: (1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。 (2) 在声明为数组时,date是数组名。...在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。 如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。...下面的声明使编译器为指针变量分配了足够的内存空间: char *p;可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。...puts(str); 用 scanf 函数和 gets 函数读字符串 在 scanf 函数调用中,不需要在 str 前添加运算符 &。因为 str 是数组名,编译器会自动把它当作指针来处理。...用 scanf 函数读入字符串永远不会包含空白字符。因此,scanf 函数通常不会读入一整行输入。换行符会使 scanf 函数停止读入,空格符或制表符也会产生同样的效果。
本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策。...文中结合自身在学习和编程中对它的认识和体会,以具体示例阐述问题,目的在于使得初学者能够正确使用scanf()函数,少走不必要的弯路。...\n"); scanf("%d, %d", &i, &j); } 上例中的scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。...说明: (1) 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。...如上例中若规定只能输入10字符给字符串指针p,则第一条scanf() 函数语句变为:scanf("%10s", p); 程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf
分析: gets函数抛弃\n,puts函数添加\n,fgets函数保留\n,fputs函数不添加\n 第一行输入中:apple pie比fgets函数读入的整行输入短,因此apple pie\n\0被存储在了数组中...= '\n') i++; words[i] = '\0'; //将\0替换为\n 如何丢弃掉仍存在输入行中的字符串?...由此可见如果输入太长,超过数组可容纳的字符数时,fgets函数最容易使用,而且可以选择不同的处理方法,如果想让程序急促使用输入行中超出的字符可以参考案例二中的处理方法,如果想丢弃初入行的超出字符,可以参考案例三中的处理方法...scanf()函数 使用scanf()和%s转换说明读取字符串。scanf()和gets()或者fgets()的区别在于它们如何缺点字符串的末尾。...scanf()和gets()类似,也存在一些潜在的缺点:如果输入行的内容过长,scanf()也会导致数据溢出,不过可以在%s转换说明中使用字段宽度可以防止溢出。
则能通过scanf语句正确给输入项读入数据的程序段是 (D) A)*p=&a; scanf("%lf",p); B)*p=&a; scanf("%f",p); C)p=&a; scanf...("%lf",*p); D)p=&a; scanf("%lf",p); 【解析】对于scanf函数,输入数据列表必须是合法地址表达式(可以使地 址常量、指针),A选项、B选项*使用错误。...3.知识点:指针变量的初始化 l 指针变量在使用前必须要初始化,把一个具体的地址赋给它,否则引用时会出错,如果不指向任何数据就赋“空值”NULL。...,并初始化,再一定义了一变量和一个指针(将指针指向数组下标为3的一个元素),执行--p;(注意,当指针指一个元素后,指针变量加上“*”时,表示引用的是元素的值,当不加“*“时表示引用的是地址),向前移动一个位置...例2.(11-03-24)设有定义:double x[10],*p=x;,以下能给数组x下标为6的元素读入数据的正确语句是( C ) A)scanf("%f",&x[6]); B)scanf
在《4. C语言 -- 一个由数据类型和取值范围引发的 BUG》的“2.2 符号位”部分我们有讲过如何将原码变为补码。这里我们需要反过来,将补码变为原码,才能获得 printf 的输出值。...所以我们在使用不同的输入函数时,要考虑在输入缓冲区是否会造成残留的问题。 ?...3.2 输入操作原理 gets()用于从标准输入流stdin读入一个整行 (以\n或EOF) 结束,写入ptr指向的字符数组,并返回这个指针;出错或遇到文件结束时则返回NULL。...如果使用scanf()会造成将一个字符串首先读入第一个空格前的部分,其余部分会残留在输入缓冲区的情况,在下次读取时可能会出现错误。...使用 scanf()和fgets()输入读入字符的示例如下所示 ?
1. scanf()函数简介 scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。...(在某些编译器内,结束输入为三次Ctrl+z) 1.4 参数 函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。...例如下面这种情况 读取两个字符存入char a和char b,但是在scanf()函数的两个格式说明符之间写了一个非空字符b,这样就会导致从键盘输入两个字符存入变量时,中间必须输入一个b,b被读取之后会被丢弃...输入格式应该像strtoul函数的base实参为16调用时识别的字符序列一样。 p 读入一个指针值。读入的字符序列应该与fprintf的%p产生的字符序列形式相同。...这也意味着,scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。 第二、scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。
所以,用户输入的数据之间,有一个或多个空格不影响 scanf()解读数据;用户使用回车键,将输入分成几行,也不影响解读。...2个数后,按 ctrl+z ,提前结束输入: 在VS环境中按3次 ctrl+z ,才结束了输入,我们可以看到 r=2 ,表示正确读取了2个数值。...另外,scanf()遇到 %s 占位符,会在字符串变量末尾存储一个空字符 \0 。 scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。...所以,存储字符串时,很可能会超过数组的边界,导致预想不到的结果。...所以,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
关于scanf("%d", &a); scanf() 是C语言的输入函数,""内为读入的内容。 %d 表示读入的变量是一个有符号整型 (int 型)的变量。...&a 表示将输入的数据存入到变量 a 所在的内存地址,可以简单理解为将输入的数据与对应变量名照应起来。...double :对应 scanf()读入和 printf() 输出应为 %lf。 printf() 在输出浮点数时,保留x位小数可以使用 %.xf,%.xlf。...字符型输入和输出: char :对应 scanf()读入和 printf() 输出应为 %c。...---- 作用: 将数组作为函数的实参传入,在函数中对数组中的值的修改,会影响函数外面的数组。
字符串输入函数 下面介绍几种常用的字符串输入函数,以及它们使用的相关不足之处 ## scanf()函数 初学者学习C语言时,第一次遇到的字符串输入函数可能就是scanf了,当我们敲会车的时候停止输入。...答案是不会的,这也是使用scanf()函数要注意的地方,打印的时候因为转换格式是%4s,所以它只读入了**zifu**,然后遇到%5s后将**chuan**读入。...当我们输入的字符超过99时,也就是说多余的字符没有预留的空间,后果就是buffer overflow,如果只是占用为使用的内存空间还好,如果它占用的是其他进程的空间,那么会导致程序异常中断。...gets()在我们输入超出的字符时是不会提醒我们的。因此C11从标准中废除了gets()函数,当然为了兼容以前的代码,大部分编译器仍然继续支持着。...## fgets()函数 fgets()第一个参数是char str,也就是指针,指向chat类型,一般是存储字符串的地址,第二个参数是读入字符的最大数量,第三个则是FILE stream,指明要读入的文件
本章重点 语句和语句块 printf函数 scanf函数 在C语言编程中,经常需要通过输入设备(如键盘)向程序录入信息,或者将信息显示在输出设备(如屏幕),这时,可以使用输入输出语句来完成...4.3.1scanf读入字符串 本节中首先介绍如何利用scanf获得用户输入的字符串。...接下来,通过一个案例来演示如何使用scanf读入字符串,如例4-13所示。...当利用scanf读入整数时,输入的整数可以包括正负号。下面是一个利用scanf读入十进制整数的例子,如例4-15所示。...printf("%d\n", i); return 0; } 在例4-15中,首先定义了一个int类型的变量i,然后使用scanf从控制台读入一个整数,最后使用printf将读入的整数输出在控制台上
而读取时遇到回车(n)而结束的,这个n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符n,这样第二次的读入函数直接从缓冲区中把n取走了,显然读取成功了,所以不会再从终端读取!...参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。 gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。...下面将前面中使用 scanf 输入字符串的程序改一下: # include int main(void) { char str[20] = "\0"; //字符数组初始化\...you i love you 可见,gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。...同样,前面章节中,对字符指针变量所指向的内存单元进行初始化也可以用 gets(),下面将那个程序也改一下,将 scanf 换成 gets(): # include int main(
input a string:123 abc 123 注意:把一个字符数组看成字符串后,可以直接使用%s来输入输出,后面直接使用数组名。...这里会使用到一个默认的字符串结束标志字符’\0’,即此时读入时,会在末尾自动加上 abc[2]=’\0’,所以输出时从字符串的头即0号元素即数组的首地址一直输出到’\0’为止,并且这个结束字符本身不会输出...字符串数组与指针 通过前面的知识,我们知道数组名表示的是这个数组的首地址,而指针变量是可以用来保存地址的。 实例:程序功能:把一个字符串中的数取出来,构成一个整数。...当需要按一定格式输出时,通常使用printf函数。 2) 字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。...可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结束。这是与scanf函数不同的。
: 一般如果读入的没空格的话,采用cin或scanf读入。...如果需要读入有空格的字符串,需要使用getline、cin.getline、fgets读入。...; 可以通过修改指针的方式控制从哪个地方起读入/输出。...在题目没超时的情况下,string比较好;输入量不大的情况下,字符数组比较好。...strcpy(a, b),将字符串b复制给从a开始的字符数组。
从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。...读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。...其调用格式为: gets(s); 其中s为字符串变量(字符串数组名或字符串指针)。...gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但...gets()函数将接收输入的整个字符串直到遇到换行为止。
scanf() 原型: int scanf(const char *format, ...); 参数说明: format:格式字符串,指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置...scanf("%d %d",&a,&b); fputs()\fgets() fputs() 作用:把str中\x00结束符之前的全部文件输入到文件中。...原型:fputs(char *str,FILE *stream); 参数说明: str:字符型指针,指向存储读入数据的缓冲区的地址。 stream : 指向输入的流。...fgets() 作用:从流stream中读入最多num个字符到字符数组str中,当遇到换行符的时候,或者读到num-1个字符时候停止。...puts()\gets() puts() 作用: 用来向标准输出设备(屏幕)写字符串并换行 原型:int puts(const char *s); 参数说明: s:可以是字符指针变量名、字符数组名、或者直接时一个字符串常量
使用scanf()有一下两个规则: 如果用scanf()读取基本变量类型的值, 在变量名前加上一个&; 如果用scanf()把字符串读入字符串数组中, 不要使用&....当scanf()检测到“文件结尾”时,会返回EOF(EOF是字符串中的特殊值,通常手动用#define指令把它定义为-1)(在CPrimerPlus第六章中讨论文件结尾相关内容以及如何利用scanf()...如果下一个未读字符是空格,那么scanf 函数将读入空格。为了强制scanf 函数在读入字符前跳过空白字符,需要在格式串转换说明符%c前面加上一个空格。...需要使用复制操作将返回值存储在变量中。和scanf 函数一样,getchar 函数也不会在读取时跳过空白字符。putchar 函数用来写单独的一个字符,如putchar(ch)。...sizeof的返回类型(C99) t 在整形转换说明后面时,表明使用表示两个指针插值的类型(C99)
如果用scanf()读取基本变量类型的值,在变量名前加上一个& 如果用scanf()把字符串读入字符数组中,不需要使用& 对于scanf(),除了%c之外的所有转换说明都会自动跳过待输入值前面的所有空白...如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。 当scanf()检测到“文件结尾”时,会返回EOF(一般会使用#define指令将EOF定义为-1)。...)将读入n-1个字符,或者读到遇到的第一个换行符 如果fgets()读到一个换行符,会把它储存在字符串中,这与gets()丢弃换行符函数不同 fgets()的第三个参数指明要读入的文件,如果读入从键盘输入的数据...:首先把目标数组中的首字符设置成空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针 在输入行未超过最大字符数时,gets_s()he gets()几乎一样。...另外,scanf()函数返回一个整数值,该值等于scanf()成功读取的项数或EOF(读到文件结尾时返回EOF) 另外,scanf()和gets()一样都存在着输入行过长时数据溢出的问题,不过在%s转换说明中使用字段宽度就可以防止溢出
如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。 下面是一次将键盘输入读入多个变量的例子。...另外,用户使用回车键,将输入分成几行,也不影响解读。 1 -20 3.4 -4.0e3 上面示例中,用户分成四行输入,得到的结果与一行输入是完全一样的。...另外, scanf() 遇到 %s 占位 符,会在字符串变量末尾存储一个空字符 \0 。 scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。...所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。...为了防止这种情况,使用 %s 占位符时,应该指定 读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
单点测试 PAT使用的就是单点测试(LeetCode应该也是单点测试)。单点测试中系统会判断每组数据的输出结果是否正确,正确则通过测试并获得这则测试的分值。题目的总得分等于通过的数据的分值之和。...通常题目有3中输入格式,下面是对应的输入程序: while...EOF型 scanf函数返回值为成功读入的参数的个数,当读入失败的时候scanf函数返回-1,而C中使用EOF(End Of File)来表示...= NULL) { // 这里填核心代码 } while...break型 这是用在题目要求当输入的数据满足某个条件时停止输入时的,例如当输入的a和b都为0时结束输入: #include <stdio.h...if(a==0 && b==0) break; printf("%d\n", a+b); // 这里可以换成别的 } return 0; } 另一种是将推出条件放在...0; } ---- 此外,多点测试中要注意每次循环前重置一下变量和数组,重置数组通常用memset或fill。
= 2){...}来判断用户输入是否正确. printf() int printf(const char *format, arg_list) printf主要是将格式化字符串输出到标准输出流中,在stdio.h...char *fgets(char *str, int num, FILE *fp) str是存放读入的字符数组指针,num是最大允许的读入字符数,fp是文件指针.fgets的功能是读一行字符,该行的字符数...下面是一个简单的例子,说明如何使用fwrite()函数将一个整数数组写入文件: #include #include using namespace std;...使用fwrite()函数将数组写入文件,最后关闭文件。...当scanf()检测到“文件结尾”时,会返回EOF(EOF是字符串中的特殊值,通常手动用#define指令把它定义为-1)(在CPrimerPlus第六章中讨论文件结尾相关内容以及如何利用scanf()
领取专属 10元无门槛券
手把手带您无忧上云