C语言字符串的输入输出
字符串的输出
在C语言中,输出字符串的函数有两个:
- puts():直接输出字符串,并且只能输出字符串。
- printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
这两个函数前面已经讲过了,这里不妨再演示一下,请看下面的代码:
- #include <stdio.h>
- int main(){
- int i;
- char str[] = "http://c.biancheng.net";
- printf("%s\n", str); //通过变量输出
- printf("%s\n", "http://c.biancheng.net"); //直接输出
- puts(str); //通过变量输出
- puts("http://c.biancheng.net"); //直接输出
- return 0;
- }
运行结果:
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
在 printf() 函数中使用%s
输出字符串时,在变量列表中给出数组名即可,不能写为printf("%s", str[]);
。
字符串的输入
在C语言中,输入字符串的函数有两个:
- scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
- gets():直接输入字符串,并且只能输入字符串。
1) 使用 scanf() 读取字符串
请先看下面的例子:
- #include <stdio.h>
- int main(){
- char str1[30], str2[30];
- printf("Input str1: ");
- scanf("%s", str1);
- printf("Input str2: ");
- scanf("%s", str2);
- printf("str1: %s\nstr2: %s\n", str1, str2);
- return 0;
- }
运行结果:
Input str1: c.biancheng.net↙
Input str2: Java Python C-Sharp↙
str1: c.biancheng.net
str2: Java
由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志`\0`。
对程序的说明:
① 我们本来希望将 "Java Python C-Sharp" 赋值给 str2,但是 scanf() 只读取到 "Java",这是因为 scanf() 读取到空格时就认为字符串输入结束了,不会继续读取了。请看下面的例子:
- #include <stdio.h>
- int main(){
- char str1[20], str2[20], str3[20];
- printf("Input string: ");
- scanf("%s", str1);
- scanf("%s", str2);
- scanf("%s", str3);
- printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
- return 0;
- }
运行结果:
Input string: Java Python C-Sharp↙
str1: Java
str2: Python
str3: C-Sharp
第一个 scanf() 读取到 "Java" 后遇到空格,结束读取,将"Python C-Sharp" 留在缓冲区。第二个 scanf() 直接从缓冲区中读取,不会等待用户输入,读取到 "Python" 后遇到空格,结束读取,将 "C-Sharp" 留在缓冲区。第三个 scanf() 读取缓冲区中剩下的内容。
关于缓冲区的知识,我们在《C语言缓冲区(缓存)详解》《结合C语言缓冲区谈scanf()函数》两节中已经进行了详细讲解。
② 在《从键盘输入数据》中讲到,scanf 的各个变量前面要加取地址符&
,用以获得变量的地址,例如:
int a, b;
scanf("%d %d", &a, &b);
但是在本节的示例中,将字符串读入字符数组却没有使用&
,例如:
char str1[20], str2[20], str3[20], str4[20];
scanf("%s %s %s %s",str1, str2, str3, str4);
这是因为C语言规定,数组名就代表了该数组的地址。整个数组是一块连续的内存单元,如有字符数组char c[10],在内存可表示为:
C语言还规定,数组名所代表的地址为第0个元素的地址,例如char c[10];
,c
就代表c[0]
的地址。第0个元素的地址就是数组的起始地址,称为首地址。也就是说,数组名表示数组的首地址。
设数组c的首地址为0X2000,也即c[0]地址为0X2000,则数组名c就代表这个地址。因为c已经表示地址,所以在c前面不能再加取地址符&,例如写作scanf("%s",&c);
是没有道理的。
有了首地址,有了字符串结束符'\0',就可以在内存中完整定位一个字符串了。例如:
printf("%s", c);
printf 函数会根据数组名找到c的首地址,然后逐个输出数组中各个字符直到遇到 '\0' 为止。
int、float、char 类型的变量表示数据本身,数据就保存在变量中;而数组名表示的是数组的首地址,数组保存在其他内存单元,数组名保存的是这块内存的首地址。后面我们会讲解指针,大家将会有更加深刻的理解。
2) 使用 gets() 读取字符串
gets 是 get string 的缩写,意思是获取用户从键盘输入的字符串,语法格式为:
gets(arrayName);
arrayName 为字符数组。从键盘获得的字符串,将保存在 arrayName 中。请看下面的例子:
- #include <stdio.h>
- int main(){
- char str1[30], str2[30];
- printf("Input str1: ");
- gets(str1);
- printf("Input str2: ");
- gets(str2);
- printf("str1: %s\nstr2: %s\n", str1, str2);
- return 0;
- }
运行结果:
Input str1: Java Python C-Sharp↙
Input str2: http://c.biancheng.net↙
str1: Java Python C-Sharp
str2: http://c.biancheng.net
可以发现,当输入的字符串中含有空格时,输出仍为全部字符串,这说明 gets() 函数不会把空格作为输入结束的标志,而只把回车换行作为输入结束的标志,这与 scanf() 函数是不同的。
总结:如果希望读取的字符串中不包含空格,那么使用 scanf() 函数;如果希望获取整行字符串,那么使用 gets() 函数,它能避免空格的截断。
C语言字符串的输入输出的更多相关文章
- C语言学习笔记---3.字符串格式化输入输出
1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...
- (C/C++学习)13.C语言字符串处理函数(一)
说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明. 一.字符串的输入输出 头文件:<stdio.h> 1.利用标准输出函数 printf() 来输出,将格式设置为 s% . ...
- C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat( ...
- C语言字符串拷贝
C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...
- C语言字符串长度(转)
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...
- C语言字符串操作常用库函数
C语言字符串操作常用库函数 *********************************************************************************** 函数 ...
- c语言字符串操作大全
C语言字符串操作函数 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #incl ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- C 语言字符串连接的 3种方式
C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...
随机推荐
- QQ在通信与传输的一些知识
http://www.nowamagic.net/librarys/veda/detail/2028 一.登录 不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态.这个TC ...
- Android开发优化之——对界面UI的优化(1)
在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开 的.界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局.通常,在这个页面中会用到很 ...
- state Threads 开源库介绍
译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...
- Python 算法(1) 快速排序
快速排序(quickSort) 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 百度百 ...
- MySQL replace into 用法
讨人喜欢的 MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果 ...
- MYSQL服务器复制配置
首先声明:此文是在失去U盘极度郁闷的时候写的,有些零散,估计也有错误.欢迎大家指出 MYSQL服务器复制配置 这是根据我之前看的MYSQL复制的文档然后自己亲自实验的过程.配置的功能比较简单. ...
- uploadify onSelect
uploadify onSelect [return false]停止选择 $("#fileEleId").uploadify({ 'width': _option.width, ...
- 大数据学习之Scala中main函数的分析以及基本规则(2)
一.main函数的分析 首先来看我们在上一节最后看到的这个程序,我们先来简单的分析一下.有助于后面的学习 object HelloScala { def main(args: Array[String ...
- MySQL防止delete命令删除数据
在sql中删除数据库中记录我们会使用到delete命令,这样如果不小心给删除了很难恢复了,总结一些删除数据但是不在数据库删除的方法. 方法一 我常用的做法,就是在数据库中加一个删除标识字段,如: is ...
- atitit.窗体静听esc退出本窗体java swing c# .net php
atitit.窗体静听esc退出本窗体java swing c# .net php 1. 监听esc 按键 1 1.1. 监听一个组件 1 1.2. 监听加在form上 1 2. 关闭窗体 2 1. ...