C语言:如何输入和输出字符数组
大家好,又见面了,我是你们的朋友全栈君。
目录
用printf输出
用scanf输入
用gets输入
用puts输出
用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数组状态如下:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
---|---|---|---|---|---|---|---|---|---|
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语言谭浩强第三版):
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
---|---|---|---|---|---|---|---|---|---|
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语言字符数组与字符串的种种 https://mp.****.net/postedit/84500208
#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);
}
用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);
}
#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);
}
推荐阅读
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
java 如何输入字符串类型_Java 语言程序设计 (V) 从对话框中获取输入内容和字符串类型
-
Java 中字符串数组的输入和输出
-
C 语言的基本输入和输出函数(详解)
-
轻松理解C语言里的数组和字符数组详解
-
在C语言中,如何操作和输入数组
-
简单易懂!C++中字符数组的输入与输出操作:原样显示字符串
-
如何用简单易懂的方式用C语言计算输入字符中各字母的出现次数
-
如何在C语言中输入一个数字数组?
-
如何在C语言中输入和输出int类型的数组