C语言字符串的输入输出
C语言适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。那么大家知道C语言字符串的输入输出是怎样的呢?下面一起来看看!
字符串的输出
在C语言中,输出字符串的函数有两个:
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
这两个函数前面已经讲过了,这里不妨再演示一下,请看下面的代码:
#includeint main(){ int i; char str[] = "http://c.biancheng.net"; printf("%s ", str); //通过变量输出 printf("%s ", "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() 读取字符串
请先看下面的例子:
#includeint main(){ char str1[30], str2[30]; printf("Input str1: "); scanf("%s", str1); printf("Input str2: "); scanf("%s", str2); printf("str1: %s str2: %s ", str1, str2); return 0;}
运行结果:
Input str1: c.biancheng.net↙
Input str2: Java Python C-Sharp↙
str1: c.biancheng.net
str2: Java
由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志` `。
对程序的说明:
① 我们本来希望将 "Java Python C-Sharp" 赋值给 str2,但是 scanf() 只读取到 "Java",这是因为 scanf() 读取到空格时就认为字符串输入结束了,不会继续读取了。请看下面的例子:
#includeint main(){ char str1[20], str2[20], str3[20]; printf("Input string: "); scanf("%s", str1); scanf("%s", str2); scanf("%s", str3); printf("str1: %s str2: %s str3: %s ", 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);是错误的。
有了首地址,有了字符串结束符'