字符串输入

如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,C库提供了三个读取字符串的函数:scanf()、gets()和fgets()。

创建存储空间

可以通过数组(char name[10])来分配存储空间,也可以通过C语言动态内存分配函数来动态分配存储空间。

char *name;
scanf("%s", name);

如果通过上面的代码来创建存储空间,可能会通过编译器,但是在读入name的时候,name会覆盖程序中的数据和代码,并可能导致程序异常终止。这个是 因为scanf()把信息复制到由name指定的地址中,而在这种情况下,参数是个 未被初始化的指针,name可能指向任何地方。

gets()函数

gets()(get string)函数对于交互式程序非常方便,它从系统的标准输入设备(通常是键盘)获得一个字符串。因为字符串没有预定的长度,所以gets()函数通过判断遇到的第一个换行符(\n)结束输入,按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,并在这些字符后添加一个空字符(\0)。

[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define MAX 81int main(void)
{char name[MAX];char *ptr; //指向char的指针printf("Please input your name.\n");ptr = gets(name); //使用一个地址吧字符串赋值给name//gets()函数使用return关键字返回字符串的地址printf("name, %s\n", name);printf("ptr, %s\n", ptr);return 0;
}

编译&运行:

[clef@rhel6164 c]$ gcc test1.c
/tmp/ccDJ9AHw.o: In function `main':
//因为gets()函数不检查存储区是否能够容纳实际输入的数据,可以用后面的fgets()函数替换gets()函数
test1.c:(.text+0x1a): warning: the `gets' function is dangerous and should not be used.
[clef@rhel6164 c]$ ./a.outPlease input your name.clefname, clef
//这里ptr和name的内容是一样的ptr, clef

如果在gets()函数在读取字符串时 出错或者遇到文件结尾,它就返回一个空(或0)地址,这个空地址被称为 空指针,并且stdio.h里面定义的常量 NULL来表示,可以用下面的代码来进行一些错误检测。

while(get(name) != NULL)

也可以通过 getchar函数来完成上面的错误检测。

while((ch = getchar()) != EOF)

注意:空指针和空字符是不一样的,不要混淆。空指针是一个地址,而空字符是一个char类型的数据对象其值为0,数字上都可以用0表示,但是概念不同:NULL是一个指针,而0是一个char类型的常量。

fgets()函数

因为gets()函数不会检查存储区是否能够容纳实际输入的数据,多出来的字符简单地溢出到相邻的内存区,所以上面的代码在编译的时候会有warning。fgets()函数和gets()函数的不同:

  • 它需要第二个参数来说明最大读入字符数。如果这个参数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止(因为会自动添加一个空字符(\n)),由这两者中最先满足的那个结束输入。
  • 如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃。
  • 它还需要第三个参数来说明读哪一个文件,从键盘上读取数据时,可以使用stdin(代表standard input)作为参数,这个标识符在stdio.h中定义。
[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define MAX 81int main(void)
{char name[MAX];char *ptr;printf("Please input your name.\n");ptr = fgets(name, MAX, stdin);printf("name, %s\n", name);printf("ptr, %s\n", ptr);return 0;
}

编译&运行:

[clef@rhel6164 c]$ gcc test1.c //这里就没有warning出现
[clef@rhel6164 c]$ ./a.out
Please input your name.
clef
name, clef
//注意这里的换行符,因为fgets()函数没有丢弃输入的换行符
ptr, clef[clef@rhel6164 c]$

scanf()函数

scanf()函数可以使用%s格式来读入一个字符串,scanf()函数和gets()函数的主要区别在于如何决定字符串何时结束。scanf()函数更基于获得单词(get word)而不是获取字符串(get string)。scanf()函数有两种方法决定输入结束,无论哪一种都是遇到的第一个非空白字符开始

  1. 如果使用%s格式,字符串读取到(但不包括)下一个空白字符(比如空格、制表符或换行符)
  2. 如果指定了字段宽度,比如%10s,scanf()函数就会读取10个字符或者直到遇到第一个空白字符,由二者最先满足的那一个终止输入

字符串输出

C语言有三个输出字符串的标准库函数:puts()、fputs()和printf()

puts()函数

puts()函数使用很简单,只需要给出字符串参数的地址,它遇到空字符(\0)就会结束输出(所以必须要有空字符)。puts()函数在显示字符串的时候,会自动在其后添加一个换行符(\n)。

[clef@rhel6164 c]$ cat test1.c
#include<stdio.h>
#define DEF "I am a #defined string."int main(void)
{char str1[80] = "An array was initialized to me.";const char * str2 = "A pointer was initialized to me.";puts("I'm an argument to puts()."); //直接用字符串做参数puts(DEF); //用宏定义做参数puts(str1);puts(str2);puts(&(str1[5])); //必须用括号strl1[5],因为str1将会首先结合&,然后在[5]结合,将出错puts(str2+4);return 0;
}

编译&执行:

[clef@rhel6164 c]$ gcc ./test1.c
[clef@rhel6164 c]$ ./a.out
I'm an argument to puts().
I am a #defined string.
An array was initialized to me.
A pointer was initialized to me.
ray was initialized to me.
inter was initialized to me.

fputs()函数

fputs()函数puts()函数面向文件版本,两者主要的区别是:

  • fputs()函数需要第二个参数来说明要写的文件,可以使用stdout(standard output)作为参数来进行输出显示。
  • 与puts()函数不同,fputs()函数并不为输出自动添加换行符。

读取一行并把它回显在下一行,用下面的两种循环都可以办到

char line[81];
while(gets(line)) //遇到文件结尾,gets()函数就会返回空指针,循环结束puts(line);
char line[81];
while(fgets(line,81,stdin))fputs(line,stdout);

printf()函数

如同puts()函数一样,printf()函数在输出字符串的时候同样需要一个字符串地址作为参数,但是printf()函数没有puts()函数方便,但是它可以格式化多种数据类型,输出的时候也不自动添加换行符。

C语言字符串输入与输出函数相关推荐

  1. c语言字符串输出函数是,C语言字符串输入与输出函数

    字符串输入 如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,C库提供了三个读取字符串的函数:scanf().gets()和fgets(). 创建存储空间 ...

  2. C语言字符串输入输出函数

    C语言字符串输入输出函数 putchar()函数 getchar()函数 puts()函数 gets()函数 getche()函数 getch()函数 putchar()函数 格式: putchar( ...

  3. C语言流输入和输出函数

    printf(scanf).puts(gets)和putchar(getchar)是分别向标准流输出(由标准流读入)字符串.一行字符和单个字符的函数.除了这些函数,C语言也提供了面向任何流的输入和输出 ...

  4. C语言-数据输入与输出函数

    1.字符数据输入/输出 1.1字符数据输出 字符数据输出可以使用 putchar() 函数,向控制台输出一个字符.函数定义: int putchar(int ch); 使用putchar() 函数需要 ...

  5. c语言字符串输入梳理总结

    C语言字符串输入输出梳理 前言 1.什么是字符串 2.输入函数 1.scanf 2.gets 3.fgets 总结 前言 在学习c语言过程中,总是遇到字符串输入出错问题,今天学习完梳理一下.c语言输入 ...

  6. c语言字符串输入输出函数总结

    1.字符串输入函数 gets()--读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符的末尾添加一个空字符使其成为一个 C 字符串.但是它无法检查数组是否装得下输入行,如果输入的 ...

  7. c语言程序输入与输出函数,C语言printf()和scanf()函数?其实就是输入输出

    在解释这两个函数之前,为了方便大家更容易理解,我们先来讲讲下面的这幅图. 这个图中的例子其实很简单,我们就是把题目通过输入设备(例如键盘鼠标)传输到计算机中,然后让计算机进行运算得出结果,再然后把结果 ...

  8. C语言字符串输入及输出的常用格式

    ---------------- 版权声明:本文为CSDN博主「爆爆爆炸beng」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://bl ...

  9. c语言字符串输入的陷阱

    首先先看一道题目:KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vo ...

最新文章

  1. 58同城招聘|三维重建、图像图形学算法工程师(校招/社招)
  2. 利用外部知识增加QA答案自然程度,这是阿里的问答模型新思路丨EMNLP
  3. 【机器学习基础】常见二分类损失函数、距离度量的Python实现
  4. 软件设计过程经验谈 之 如何做好领域模型设计
  5. PHP内核探索:新垃圾回收机制说明
  6. 布朗语料库中不同部分的情态动词频率直方图绘制的代码详细解释
  7. js控制a标签点击事件 触发下载
  8. java word 饼图_[Java教程]echarts标准饼图解读(一)——基本配置demo
  9. vue if判断_VUE学习记录2
  10. mysql怎么拆字符串_MySQL截取和拆分字符串函数用法示例
  11. python按位与怎么算_python 的按位与、或、异或 运算
  12. jsoup教程_3 Jsoup 讲解
  13. C#获取当前路径的七种方法
  14. javascript调试
  15. [转]虚方法(virtual)和抽象方法(abstract)的区别
  16. App裂变活动多种玩法解析
  17. WinEdit + CTex 打开论文模板出现乱码
  18. QT Review之 QSlider(滑块)
  19. excel切片器显示错误_使用切片器在Excel中设置过滤条件
  20. 天涯论坛的经典回帖!!!

热门文章

  1. 不等式视角下的策略梯度算法
  2. 做BI的痛,你懂吗?
  3. “鸡”不可失,驱动人生助力开启“绝地求生”
  4. 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
  5. 微信小程序性能,行为收集探针实现
  6. 【MySQL】查询语句
  7. Redux 源码解读 —— 从源码开始学 Redux
  8. 闲鱼已售商品信息查询系统。手搓市场定价/行情查询利器
  9. 怎么判断英文网站是否做过谷歌优化?
  10. 杭电计算机考研经验总结