上次讲到字符串,这里要补充讲一下字符串的输入和输出。
字符串是由双引号括起来的若干字符,可以是一个字符,也可以是多个字符,甚至可以是0个字符。
C++有专门的字符串的数据类型,string。
如果定义一个字符串变量,可以用如下语法:
string a;
1定义
但C语言没有专门的字符串的数据类型,要用到字符串变量,必须用一维数组来定义。
语法格式:
char 数组名[数组长度];
比如:
char a[100], b[20];
2 初始化
字符数组的初始化有三种形式:
(1)和普通的一维数组的初始化一样,一个一个元素赋初值。如:
char t[5]={ ‘a’, ‘b’ ‘c’, ‘d’, ‘e’ };
(2)用字符串常量初始化:
char t[6]={ “abcde” };
注意这里数组t的长度为6,因为字符串”abcde“有一个默认的结束符,为’\0’,也就是说,字符串”abcde”的实际长度为6,包含6个字符:’a’、’b’、‘c’、’d’、‘e’、‘\0’,所以必须定义数组t的长度至少为6。
但字符串的”abcde”的有效长度为5,因为它的有效字符不包含最后的‘\0’。
字符数组的长度必须大于等于字符串的有效长度+1。
(3)用字符串常量初始化,可去掉大括号:
char t[6]= “abcde” ;
注意这里数组t的长度必须大于等于6,因为字符串“abcde”的实际长度为6。
3 字符串输入输出
也有三种形式:
(1)一个一个字符输入输出
字符对应的格式控制符是%c。
程序1:
这里是一个一个字符输入,最后输入回车时结束,同时给最后一个字符赋值为’\0’。这是为了以后循环时作为循环结束条件用。
运行结果:
有一个函数是专门用于输入字符的,即:getchar()
它的含义是输入一个字符。
语法格式:
变量名=getchar( );
如:
char a;
a = getchar( );
a=getchar()和scanf(“%c”, &a)是一样的。
所以程序1中凡是出现scanf(“%c”, s[i])的地方,都可以改为:s[i]=getchar( ) 。
用getchar()有更简洁的地方,程序1和以下程序2是一样的:
程序2:
(2)整体输入输出字符串,格式控制符是%s
如果有定义 char a[80];
则输入输出时可以整体输入输出,不需要一个一个字符处理。
输入: scanf(“%s”, a);
输出: printf(“%s”, a);
这里特别注意,用%s整体输入字符串时,字符数组变量a的前面没有& 。
运行结果:
注意:程序1和程序2还是有区别的,程序1是运行时等待用户输入一个回车才结束输入,同时回车键之前的字符都存放到字符数组里面了。
但是程序2是默认以空格作为输入结束符的,如果遇到空格,则空格前面的字符存放到字符数组中,自动加入字符串结束符’\0’。
比如输入的字符串是:ABC DEF HIJK,
则程序1的运行结果是:
程序2的运行结果是:
(3)整体输入输出字符串,用系统函数gets()和puts()
假设有定义:
char a[80];
则整体输入字符串的系统函数gets()语法格式为:
gets(a);
整体输出字符串的系统函数puts()语法格式为:
puts(a);
注意gets()和用%s输入不同的地方是:gets()以回车结束输入。
程序3:
运行结果:
初学者特别容易把getchar( )和gets( )搞混,而且很容易写成:
getchar(变量名)
这种形式。一定要注意:
getchar( )是输入一个字符,格式为:
变量名=getchar( );
gets( )是整体输入字符串,格式为:
gets(变量名);
常用的是整体输入字符串,但是一般会在输入后进行一些处理,此时需要一个一个字符处理,处理完毕后再整体输出或者根据具体情况输出结果。
我个人比较喜欢用gets()来输入字符串,但是输出经常用不到puts(),因为很多时候需要一个一个字符处理并输出。