- 浏览: 279212 次
- 性别:
文章分类
最新评论
//本节内容摘自对Stephen Prata的《C Primer Plus》第五版
一.字符串的输入
如果想把一个字符串读到程序中,必须首先保留存储字符串的空间,然后使用输入函数来获取这个字符串。
要想读入字符串,必须分配足够大的存储区来存放希望读入的字符串。
char *name;
scanf("%s",name);
这可能会通过编译器,但是在读入name的时候,name会覆盖程序中的数据和代码,并可能导致程序异常中止。这是因为scanf()会把读入的信息放入由参数给定的地址中,在这种情况下,参数是个未被初始化的指针,name可能指向任何地方。
故在读入数据时要给定数据所占的存储空间,如:
int name; char name[40];
二.输入函数:gets(),fgets(),scanf()
1.gets()
gets() (代表get string),使用地址作为参数,它从系统的标准输入设备(通常是键盘)获得一个字符串。
因为字符串没有预订的长度,所以gets()需要知道输入何时结束。解决办法是读字符串直到遇到一个换行符(\n),按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序。它将读取换行符并将其丢弃,这样下一次读取就会在新的行开始。
例:
char name[81]; /*分配空间*/
printf("Hi ,what is your name?");
gets(name);
printf("%s\n",name);
返回值:如果读入正常,则返回的是读入字符串的地址(即一个指向char型的指针),如果出错或gets()遇到文件结尾,则返回一个空(或0)地址。这个空地址被称为空指针,并用stdio.h里定义的常量NULL来表示。
因此gets()中还加入了一些错误检测,这是它可以很方便的以如下形式使用:
while(gets(name) != NULL)
这样的指令使您既可以检查是否到了文件结尾,有可以读取一个值。如果遇到了文件结尾,name中什么也不会读入。
(顺便提一下,不要混淆空指针和空字符。空指针是一个地址,而空字符是一个char类型的数据对象,其值为0.数值上两者都可以用0表示,但他们的概念不同:NULL是一个指针,而0是一个char类型的常量)
2.fgets()
gets()的一个不足时它不检查预留存储区是否能够容纳时间输入的数据。多出来的字符简单的演绎出到相邻的内存区。fgets()函数改进了这个问题,它让您指定最大读入字符数。由于fgets()是为文件I/O而设 计的,在处理键盘输入时就不如gets()那么方便。fgets()和gets()有三个方面不同:
- 它需要第二个参数来说明最大读入字符数。如果这个参数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止,有这两者中最先满足的那个来结束输入。
- 如果fgets()读到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。
- 它还需要第三个参数来说明读哪一个文件。从键盘上读数据时,可以使用stdin作为该参数,这个标识符在stdio.h中定义。
例:
char name[81];
char *ptr;
ptr = fgets(name,81,stdin);
printf("%s",ptr);
由于gets()不检查目标数组师傅能够容纳输入,所以不安全,几年前有人注意到操作系统代码使用gets(),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码,从而发明了在UNIX网络上传播的“蠕虫”病毒。那些系统代码后来被不使用gets()的代码所代替。因此对与重要的编程,应该使用fgets()而不是gets().
3.scanf()函数
scanf()函数使用%s格式读入一个字符串。scanf()和gets()主要的差别在与他们如何决定字符串何时结束。scanf()更急于获取单词而不是获取字符串;而gets()函数会读取所有的字符,直到遇到第一 个换行符为止。scanf()使用两种方法决定输入结束。无论那种方法,字符串都是以遇到的第一个非空白字符开始。如果使用%s格斯,字符串读到(但不包含)下一个空白字符(空格,制表符或换行符)。如果 指定了字段宽度,比如%10s,scanf()会读入10个字符或知道遇到第一个空白字符,由二者中最先满足的哪一个终止输入。
scanf()函数返回一个整数值,这个值是成功读取的项目数;或者当遇到文件结束时返回EOF。
根据所需输入的特点,用gets()从键盘读取文本可能要更好,因为他更容易被使用,更快,且更简洁。scanf()主要用于以某种标准形式输入的混合类型数据的读取和转换。例如,如果每一个输入行都包含一种工具的名称,库存数量和单价,您就可以使用scanf();否则您必须在函数中自己处理输入错误的检验。如果希望以此值读入一个单词,最好使用scanf().
二.字符串的输出:puts(),fputs(),printf()
1.puts()函数
puts()函数使用很简单,只需要给出字符串参数的地址。
例:
char *name = "hellow wold";
puts(name);
与printf()不同,puts()函数显示字符串时自动在其后添加一个换行符。puts()输出时遇到空字符(\0)停止,所以应确保输出的字符串中有空字符。
2.fputs()函数
fputs()函数是gets()的面向文件版本。两者之间的主要区别:
- fputs()需要两个参数来说明要写的文件。可以使用stdout作为参数来进行那个输出显示,stdout在stdio.h中定义
- 与puts()不同,fputs()并不为输出自动添加换行符。
注意:gets()丢掉输入里的换行符,但是puts()为输出添加换行符。另一方面,fgets()存储输入中的换行符,而fputs()也不为输出添加换行符。
应把puts()和gets()结合使用,fputs()和fgets()结合使用。
发表评论
-
C中结构体
2013-01-09 15:47 591把结构体保存到文件中,用fwrite()函数: fwrite ... -
关于socket编程中基本函数介绍
2012-11-03 13:57 996源自:http://blog.sina.com.cn/s/bl ... -
C中需要注意的小问题
2012-09-27 08:59 7821.在用scanf()函数读入double型数值时要用%lf的 ... -
指针和多维数组
2011-12-26 10:03 785摘自:《C primer plus》 指针和多位数组 ... -
C中<ctype.h>库
2011-12-19 20:21 694标准库<ctype.h> 1 ... -
C中double类型数据的输入和输出
2011-12-19 10:04 12346double a; scanf(" ... -
C中printf()和scanf()函数说明
2011-12-16 19:58 1559下面是对printf()和scanf()函数的说明: ... -
C中转义序列及其含义
2011-12-15 20:27 941转义序列: 序列 ... -
C中各数据类型取值范围
2011-12-15 19:31 13641.标准头文件<limits.h>中包含了 ... -
C中常用的类型转换函数
2011-12-14 17:34 784源自:http://hi.baidu.com/hao_%BF% ... -
C语言格式化输出系统时间
2011-12-14 17:04 5898源自:http://blog.csdn.net/jiadeli ... -
C中目标代码文件,可执行文件和库
2011-12-14 10:19 1932C编程的基本策略是使用程序将源代码文件转换为可执行 ... -
vs2008下vc的库函数及头文件存放位置
2011-12-13 22:14 4504在写C/C++程序时总会在开头包含一些头文件,如:#inclu ... -
malloc()函数
2011-12-12 17:35 0待写 -
用C写的模拟掷骰子程序
2011-12-12 16:47 2320整理自:《C Primer Plus》第五版 此程序包 ... -
指针的基本操作以及关于指针的注意事项
2011-12-11 17:42 895一. 指针的基本操作有:赋值(assignment),求值(v ... -
关于*与++的优先级
2011-12-11 16:53 1661C中一元运算符*和++具有相等的优先级,但它们在结合时是从右向 ... -
C中关于数组参数的传递
2011-12-09 11:43 893编写一个对数组进行操作的函数,目的是返回数组内所用元素的和。 ... -
C中有关数组的说明
2011-12-09 11:10 746下面介绍一下关于数组的一些说明: 在数组声明时必须 ... -
C语言中对sizeof()和strlen()的说明
2011-12-09 10:01 10931.sizeof函数 sizeof函数返回表达式所占的内存空 ...
相关推荐
C常用库函数-表 数学函数、字符函数、字符串函数、输入输出函数、动态分配函数和随机函数 C常用库函数-表 数学函数、字符函数、字符串函数、输入输出函数、动态分配函数和随机函数 C常用库函数-表 数学函数、字符...
C语言编程-编写函数fun求一个字符串的长度,在main函数中输入字符串,并输出其长度;
写自定义函数stringLower()实现将一个字符串中所有大写字母变为小写字母。在主函数中输入一含有大写字母的字符串,调用该函数并输出改变后的字符串。
C语言程序设计-将主函数中输入的字符串反序存放;例如:输入字符串“abcdefg”,则应输出“gfedcba”;.c
C语言字符串处理函数整理版本,包含字符串基本操作,字符串类型转换、字符检查、输入输出流、输入输出流分割、异常处理等
要求用字符指针定义并调用函数strmcpy(s,t,m),它的功能是将字符串t中从第m个字符开始的全部字符复制到字符串s中。 【输入形式】 首先打印提示"Input a string:";然后直接在冒号后面输入字符串,作为t的内容,字符...
C语言字符串函数总结: 1.字符处理库(ctype)中的函数 2.stdio中的字符串和字符输入/输出的函数 3.通用实用库stdlib中的字符串转换函数 4.字符串处理库string中的字符串处理函数
包含了所有的C语言字符串函数。 C语言字符串函数大全: 1.字符处理库(ctype)中的函数 2.stdio中的字符串和字符输入/输出的函数 3.通用实用库stdlib中的字符串转换函数 4.字符串处理库string中的字符串处理函数
设计字符串比较的函数和销售员业绩管理程序1. 有两个字符串,各有10个字符,是编程完成如下功能: (1)分别找出两个字符串中最大的字符元素; (2)将两字符串对应位置元素逐个比较,并统计输出两个字符串对应元素大于...
在 `main` 函数中,我们使用一个循环来输入每个字符串,然后再使用另一个循环来输出这些字符串。 当你运行这段代码时,程序会提示你输入5个字符串,然后将它们逐行输出。这个示例演示了如何在C语言中输入字符串数组...
编写c语言小程序,使传入一个字符串按反序存放,在主函数中输入和输出字符串。
C语言内没有字符串替换函数,此函数实现字符串替换
file1.c(文件1) .../*以上3行声明在本函数中将要调用的在其他文件中定义的3个函数*/ char c; char str[80]; enter_string(str); scanf(“%c”,&c); delete_string(str,c); print_string(str); }
在不调用string.h库函数的情况下用C语言进行字符串切分,并且不用调用get()函数利用最基本的输入输出语句,实现字符串切分操作
最后,使用printf函数将处理后的字符串输出到标准输出中。 需要注意的是,gets函数在最新的C标准中已经被弃用,建议使用fgets函数代替。同时,需要限制输入的字符串长度,以避免缓冲区溢出等安全问题。可以考虑使用...
编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” 函数头是这样的: //pStr是指向以'\0'结尾的字符串的指针
编写程序,使用函数itob(n,s,b)将输入的整数n,转换成字符串s,将s输出.转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的字符串的第一个字符为’-’。b为大于1小于37的任意自然数值。当b=2时,...
编写一个对字符串处理的程序,要求能够识别字符串中大写字母、小写字母以及数字的个数并输出,识别“L”、“o”、“v”、“e”四个字符的位置,如果有,将四个字符和对应的ASC-II分别存储在字符和int数组中并显示;...
输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())