C语⾔:字符数组的输⼊输出
⽬录
⽤printf输出
输出⽅法1:printf 逐个字符输出。
void main(void){
char c[ ] = "I am happy";
int i;
for(i =0; i < 10; i++){
printf("%c", c[i]);
}
printf("\n");
}
输出⽅法2:printf 将整个字符串⼀次输出。
void main(void){
char c[ ] = "I am happy";
printf("%s", c); //必须得是字符数组名,c.
}
⽤scanf输⼊
如果scanf中%d是连着写的如“%d%d%d”,在输⼊数据时,数据之间不可以⽤逗号分隔,只能⽤空⽩字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输⼊数据时需要加“,”,
如“2,3,4”。
输⼊⽅法1:scanf 逐个字符输⼊。
void main(void){
char c[10];
int i;
printf("请输⼊多个字符(不多于10个):");
for(i = 0; i < 10; i++){
scanf("%c", &c[i]);
}
printf("输⼊的多个字符为:%s", c);
}
输⼊⽅法2:scanf 输⼊⼀个字符串。
void main(void){
char c[10];
printf("请输⼊多个字符(不多于10个):");
scanf("%s", c);
printf("输⼊的多个字符为:%s", c);
}
scanf("%s", c);
//系统⾃动在China后⾯加⼀个'\0'结束符。
printf("%s", c);
//按字符数组名c到其数组起始地址,然后逐个输出其中的字符,直到遇到'\0'为⽌。
为什么只输出⼀个anan呢?
由于系统把空格字符作为输⼊的字符串之间的分隔符,因此只将空格前的字符anan送到数组c中。
//数组中未被赋值的元素的值⾃动置'\0'。
由于把"anan"作为⼀个字符串处理,故在其后加'\0。c数组状态如下:
0123456789
a n a n\0\0\0\0\0\0
内存格式不是书上说的那种?Why?
输⼊⽅法3:scanf 输⼊多个字符串。
void main(void){
char c1[10], c2[10], c3[10], c4[10];
printf("请输⼊⼀个字符串(有四个单词,每个不多于10个字母):");
//这个注释好像有点问题,按照理解,应该是⼀个单词表⽰⼀个字符串。
scanf("%s%s%s%s", c1, c2, c3, c4);
printf("输⼊的字符串为:%s %s %s %s ", c1, c2, c3, c4);
}
输⼊后各个字符数组的状态如下(摘⾃C语⾔谭浩强第三版):
0123456789
a n a n\0\0\0\0\0\0
i s\0\0\0\0\0\0\0\0
a\0\0\0\0\0\0\0\0\0
g i r l.\0\0\0\0\0
下⾯这个程序是为了验证上⾯那个内存的存储状态:程序见后⾯
根据上⾯的输出结果可以看出,不是所有未赋初值的元素都是\0,为什么呢?到底应该是什么样⼦的呢?
为了解决scanf函数不能完整地读⼊带有空格字符的字符串,C语⾔提供了⼀个专门⽤于字符串的函数gets,它读⼊全部字符(包括空格),直到遇到回车为⽌。
注:只要遇到空⽩字符就结束输⼊,空⽩字符包括空格、tab、enter
⽤gets输⼊
gets(字符数组)
从终端输⼊⼀个字符串到字符数组,并且得到⼀个函数值。该函数值是字符数组的起始地址。它读⼊全部字符(包括空格),直到遇到回车为⽌。gets()函数并不读取换⾏符'\n',它会把换⾏符替换成空字符'\0',作为c语⾔字符串结束的标志。
gets(str)
从键盘输⼊:
Computer回车
将输⼊的字符串"Computer"送给字符数组str(请注意,送给数组的共有9个字符,⽽不是8个字符),函数值为字符数组str的起始地址。
⼀般利⽤gets函数的,⽬的是向字符数组输⼊⼀个字符串,⽽不关⼼其函数值。
void main(void){
char c[10];
printf("请输⼊多个字符(不多于10个):");
gets(c);
printf("输⼊的多个字符为:%s", c);
}
可以看到,成功解决了scanf遇到空⽩字符就终⽌的问题。
但是很明显的可以卡到,输⼊的字符⼤于10个字符,但是并没有出错,这就说明:
gets()函数存在⼀个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输⼊⾏。
如果输⼊的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的⽬标空间。
gets()函数就会访问未被分配的内存空间,如果这些内存未被使⽤,不会⽴即出现问题;如果这⽚空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中⽌。
下⾯这⼀段呢,是根据⾃⼰之前做的⼀些⼯作,见下⾯。
⾃⼰的⼩疑虑:输⼊8个字符,为什么不把最后的两个'\0'输出呢?
答案:⼩傻⼦,你是⽤%s输出的字符串,字符串是遇'\0'则⽌的字符数组,所以就输出有效字符就好了。看下⾯的例⼦,我们把字符数组
⾥⾯所有的字符输出,是不是就有那两个'\0'呢。
C语⾔字符数组与字符串的种种
#include<stdio.h>
void printByChar(char c[], int count){
int i;
printf("**");
for(i = 0; i < count; i++){
printf("%c", c[i]);
}
printf("**\n");
}
void main(void){
char c[10];
printf("请输⼊多个字符(不多于10个):");
gets(c);
printf("输出字符数组中的所有字符:");
printByChar(c, 10);
printf("输出的字符串为:**%s**", c);
c语言如何创建字符串数组}
⽤puts输出
puts(字符数组)
将⼀个字符串(以'\0'结束的字符数组)输出到终端。在输出时将字符串结束标志'\0'转换成'\n',即输出完字符串后换⾏。
//验证内存存储
#include<stdio.h>
void printByChar(char c[], int count){
int i;
printf("**");
for(i = 0; i < count; i++){
printf("%c", c[i]);
}
printf("**\n");
}
void main(void){
char c[10];
printf("请输⼊⼀个字符串(有四个单词,每个不多于10个字母):"); scanf("%s", c);
printf("输⼊的字符串为:%s\n", c);
printf("字符数组中所有元素为:\n");
printByChar(c, 10);
}
//验证内存存储
#include<stdio.h>
void printByChar(char c[], int count){
int i;
printf("**");
for(i = 0; i < count; i++){
printf("%c", c[i]);
}
printf("**\n");
}
void main(void){
char c1[10], c2[10], c3[10], c4[10];
printf("请输⼊⼀个字符串(有四个单词,每个不多于10个字母):"); scanf("%s%s%s%s", c1, c2, c3, c4);
printf("输⼊的字符串为:%s %s %s %s\n", c1, c2, c3, c4);
printf("各个字符数组中所有元素为:\n");
printByChar(c1, 10);
printByChar(c2, 10);
printByChar(c3, 10);
printByChar(c4, 10);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论