- 浏览: 283091 次
- 性别:
文章分类
最新评论
//本节内容摘自对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 615把结构体保存到文件中,用fwrite()函数: fwrite ... -
关于socket编程中基本函数介绍
2012-11-03 13:57 1030源自:http://blog.sina.com.cn/s/bl ... -
C中需要注意的小问题
2012-09-27 08:59 8121.在用scanf()函数读入double型数值时要用%lf的 ... -
指针和多维数组
2011-12-26 10:03 813摘自:《C primer plus》 指针和多位数组 ... -
C中<ctype.h>库
2011-12-19 20:21 718标准库<ctype.h> 1 ... -
C中double类型数据的输入和输出
2011-12-19 10:04 12393double a; scanf(" ... -
C中printf()和scanf()函数说明
2011-12-16 19:58 1589下面是对printf()和scanf()函数的说明: ... -
C中转义序列及其含义
2011-12-15 20:27 973转义序列: 序列 ... -
C中各数据类型取值范围
2011-12-15 19:31 13891.标准头文件<limits.h>中包含了 ... -
C中常用的类型转换函数
2011-12-14 17:34 815源自:http://hi.baidu.com/hao_%BF% ... -
C语言格式化输出系统时间
2011-12-14 17:04 5932源自:http://blog.csdn.net/jiadeli ... -
C中目标代码文件,可执行文件和库
2011-12-14 10:19 1955C编程的基本策略是使用程序将源代码文件转换为可执行 ... -
vs2008下vc的库函数及头文件存放位置
2011-12-13 22:14 4569在写C/C++程序时总会在开头包含一些头文件,如:#inclu ... -
malloc()函数
2011-12-12 17:35 0待写 -
用C写的模拟掷骰子程序
2011-12-12 16:47 2345整理自:《C Primer Plus》第五版 此程序包 ... -
指针的基本操作以及关于指针的注意事项
2011-12-11 17:42 916一. 指针的基本操作有:赋值(assignment),求值(v ... -
关于*与++的优先级
2011-12-11 16:53 1723C中一元运算符*和++具有相等的优先级,但它们在结合时是从右向 ... -
C中关于数组参数的传递
2011-12-09 11:43 920编写一个对数组进行操作的函数,目的是返回数组内所用元素的和。 ... -
C中有关数组的说明
2011-12-09 11:10 787下面介绍一下关于数组的一些说明: 在数组声明时必须 ... -
C语言中对sizeof()和strlen()的说明
2011-12-09 10:01 11181.sizeof函数 sizeof函数返回表达式所占的内存空 ...
相关推荐
C语言编程-编写函数fun求一个字符串的长度,在main函数中输入字符串,并输出其长度;
C语言字符串的输入和输出 C 语言中字符串的输入和输出是非常重要的知识点,掌握这些知识点可以让开发者更好地处理字符串的输入和输出。 首先,C 语言中字符串的输入可以使用 scanf 函数,scanf 函数可以将用户输入...
这些函数广泛应用于各种场合,包括但不限于字符串的输入输出、连接、复制、比较和长度计算等。以下是一些基本且常用的字符串处理函数的介绍和说明: 1. puts函数:这个函数的主要作用是将一个字符串输出到终端。其...
通过以上两个自定义函数,我们可以非常方便地从 C 语言中的字符串中截取出所需的子字符串。这些函数不仅提供了灵活性,还具有很好的健壮性,能够有效地处理各种异常情况。这对于处理复杂的字符串操作非常有用。
这个程序展示了C语言中基本的字符串操作、函数调用、数组操作以及字符输入输出等功能,同时也体现了模块化编程的思想。在实际开发中,这种结构可以被扩展应用于更复杂的字符串处理任务,如替换字符、查找子串等。
C语言字符串总结 在C语言中,字符串是字符数组的特殊形式。字符串的定义方式有多种,包括使用字符数组、字符串常量和动态内存分配等。字符串的输出方式也多种多样,可以使用循环下标法、转义字符%s和puts函数等。 ...
在这个代码中,我们首先在`main()`函数中获取用户输入的字符串。`std::getline()`函数用于读取一行,包括空格,这比简单的`std::cin >> input;`更合适,因为它不会在遇到空格时停止读取。 然后,我们调用`...
在 main 函数中,我们首先定义了两个字符数组 a 和 b,然后使用 gets() 函数从标准输入中读取两个字符串。最后,我们调用自定义的 strcat() 函数,将两个字符串连接起来。 字符串连接函数的分析 在分析上面的示例...
6. 字符串格式化:学习使用printf()和scanf()函数处理字符串输入和输出,以及如何使用sprintf()和sscanf()在内存中操作字符串。 7. 字符串操作:了解strtok()函数分割字符串,以及其它如strpbrk(), strspn(), ...
根据提供的文件信息,本文将详细解释“C语言删除字符串中指定的所有字符”的实现方法与原理。此代码示例提供了一种高效的方法来移除字符串中的特定字符,并且已经在Windows和Linux环境下进行了测试验证。 ### 一、...
在计算机科学中,字符串输入输出函数是指可以读取用户输入的字符串或数字,并将其输出到屏幕上的一类函数。这些函数在实际应用中非常重要,因为它们可以与用户交互,获取用户的输入,并将结果输出给用户。 在本节中...
### C语言中字符串的处理方式 #### 引言 C语言是一种广泛使用的程序设计语言,尤其是在系统编程、嵌入式开发等领域中具有不可替代的地位。其中,字符串处理是C语言编程的重要组成部分。本文将深入探讨C语言中字符...
C语言中的标准输入输出函数是编程基础中的重要组成部分,它们为程序员提供了强大的工具来处理数据的输入和输出。本文将深入解析C语言标准输入输出函数,特别是格式化输入输出函数printf()和scanf(),以及它们在Turbo...
C语言字符串处理函数整理版本,包含字符串基本操作,字符串类型转换、字符检查、输入输出流、输入输出流分割、异常处理等
C语言中的字符串处理是编程面试中的常见主题,尤其是在嵌入式系统或底层开发相关的面试中。下面我们将深入探讨一些基于`string.h`库的常用字符串函数,并提供一些问题的解决方案。 1. **字符串函数** - `strlen`: ...
编写一个函数count,有实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。 要求:(1)定义统计函数count来实现。 函数的原型为:void count(char str...
C语言程序设计-将主函数中输入的字符串反序存放;例如:输入字符串“abcdefg”,则应输出“gfedcba”;.c
本文详细介绍了如何在C语言中实现字符串的循环右移,包括了两种不同的实现方法:一种使用字符串复制函数 `strcpy`,另一种使用内存拷贝函数 `memcpy`。每种方法都有其适用场景,开发者可以根据实际需求选择最适合的...
要求用字符指针定义并调用函数strmcpy(s,t,m),它的功能是将字符串t中从第m个字符开始的全部字符复制到字符串s中。 【输入形式】 首先打印提示"Input a string:";然后直接在冒号后面输入字符串,作为t的内容,字符...
本文将通过一个具体的例子——使用C语言实现字符串的反向输出,来深入理解递归的基本概念及其应用。 #### 一、递归基础 递归(Recursion)是指在一个函数的定义或执行过程中直接或间接地调用自身的一种方法。递归...