C语言:字符数组的输入输出

article/2025/5/14 15:56:35

目录

用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语言字符数组与字符串的种种   CSDN

#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); 
}


http://chatgpt.dhexx.cn/article/298sNP52.shtml

相关文章

c语言---字符输入

1 getchar() getchar接受一个字符 可输入任何字符 结束标志由自己决定,需在后面手动补全\0 输入 &#xff1a;abcd d 打印&#xff1a;6 2 fgets() fgets(); 函数原型 char *fgets(char *str, int n, FILE *stream) 输入读取&#…

C语言学习(十一)之字符输入/输出

文章目录 一、单字符I/O&#xff1a;getchar()和putchar()二、缓冲区2.1 什么是缓冲区2.2 为什么需要缓冲区2.3 缓冲区分类2.3.1 完全缓冲I/O2.3.2 行缓冲I/O 三、结束键盘输入3.1 文件、流和键盘输入3.2 文件结尾 四、重定向和文件4.1 重定向输入4.2 重定向输出4.3 组合重定向…

C语言_输出字符串和获取字符串

输出字符串和获取字符串 01——输出字符串 使用puts函数来输出字符串 使用printf函数来输出字符串 通过puts函数和printf函数都能够实现字符串输出 02——获取字符串 使用scanf函数来获取字符串 使用gets()函数来获取字符串. gets函数原型&#xff1a;char* gets(char *st…

c语言之printf函数输出字符数据

//用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c a;int i 97;//输出变量%c以字符形式输出&#xff0c;%d以十进制整型形式输出printf("c%c,c%d\n", c, c);printf("i%c,i%d\n", i, i);return 0; } 运行结果&…

在C语言中怎样定义一个字符串并输入输出

在C语言中没有字符串类型&#xff0c;用字符数组处理字符串 字符数组定义&#xff1a;char 数组名 [常量表达式][常量表达式] 说明&#xff1a;一维字符数组&#xff0c;用于存储和处理一个字符串 。二维字符数组&#xff0c;用于同时存储和处理多个字符串 输入输出方法&…

用C语言输出一个字符串的所有子串

前言 啥是子串? 串中任意个连续字符组成的子序列称为该串的子串。 包含子串的串相应地称为主串。 ①空串是任意串的子串。 ②任意串是其自身的子串。 例&#xff1a;字符串"12"它的字串为"1",“2”,“12”,空串。共四个字串。 原理 懂了子串的概念我们…

C语言 字符数据输入输出

文章目录 C语言的标准库函数头文件 字符数据的输入输出putchar 函数&#xff08;单字符输出函数&#xff09;输出一个字符&#xff1a;输出控制字符输出转义字符 getchar 函数&#xff08;单字符输入函数&#xff09; 所谓数据的输入输出是从计算机角度出发的。 C语言本身没有…

c语言输出汉字字符串,c语言怎么输出字符串

C语言输出简单的字符串&#xff0c;例如个人信息的相关字符串&#xff0c;包括姓名、出生日期、号码。我们可以通过printf()函数直接打印输出指定信息字符串。 推荐教程&#xff1a;《C视频教程》 下面我们就通过简单的代码示例&#xff0c;给大家介绍c语言输出个人信息相关字符…

C语言程序——输出字符

为学日益&#xff0c;为道日损 文章目录 前言一、使用C语言一般格式显示字符二、编写代码2.运行结果 总结 前言 一个标准的C语言程序具有的一般格式&#xff1a; 预处理命令和全局性的声明 main() 主函数 { 局部变量声明 语句序列 } fun1()函数1 { 局部变量声明 语句序列 } fu…

C语言字符和字符串的输入与输出

C语言 一、输入单个字符 1、scanf函数输入单个字符 C语言scanf输入时缓冲区问题 scanf函数是标准输入流&#xff08;从键盘接收数据)&#xff0c;接收的数据放入输入缓冲区中&#xff0c;其中就包括在键盘输入的空格、回车这类字符&#xff0c;当你用%d接收时是不会影响的&a…

【C语言--字符数据的输入输出】

1、putchar函数–字符输出函数 功能是在显示器上输出单个字符。形式为&#xff1a;putchar(字符变量); 例如&#xff1a; putchar(A);//输出大写字母A putchat(x);//输出字符变量x的值2、getchar函数–键盘输入函数 功能是从键盘上输入一个字符。形式为&#xff1a;getchar(…

C语言打印输出字符串的几种方法

思路分析 知识点补充 1&#xff0c;在C语言中&#xff0c;一维数组的数组名实际上就是指向数组首项元素的指针。 2&#xff0c;如果指针p已经指向一个字符串&#xff0c;判断字符串是否结束&#xff0c;一般采用while(*p!\0)的办法。 以打印输出arr[30]"hello world&qu…

C语言——字符串、打印字符串的三种方式

文章目录 前言一、字符串1.字符串常量2.注意 scanf() 读取字符串例如&#xff0c;scanf() 输入中间有空格的字符串后观察打印情况 3.sizeof()函数计算字符串尺寸&#xff0c;strlen()函数计算字符串长度例子&#xff1a; 4.字符数组定义和初始化(1)传统的字符集合赋值&#xff…

C语言 格式输入输出与字符输入输出

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、 格式输入输出 1、格式输出——printf函数 &#xff08;1&#xff09;格式 printf("格式控制"&#xff0c;输出列表项)&#xff1b; 格式控制分为格式声明&#xff08;%和格式字符&am…

jmeter+ant+jenkins-接口自动化持续集成(与之类似的postman+newman+Jenkins接口自动化持续集成)

jmeterantjenkins-接口自动化持续集成 jmeterantjenkins-接口自动化持续集成基本安装配置Ant配置Jmeter配置Jenkins&#xff0c;构建持续集成 jmeterantjenkins-接口自动化持续集成 Jmeter可以做接口测试&#xff0c;也能做压力测试&#xff0c;而且是开源软件 Ant是基于Java的…

MAC jmeter+ant 实现接口测试并将接口测试报告以邮件的形式发出-超详细

最近项目组涉及到接口测试&#xff0c;然后自己想着如何输出接口测试的报告&#xff0c;经过自己的了解&#xff0c;发现测试行业中每个公司每个测试人员输出的方式都不一样的。常规的有以下几种 使用表格的形式&#xff0c;手动去写&#xff0c;以总结的形式&#xff0c;给到…

jmeter+ant+jenkins接口自动化测试框架搭建

一个完整的接口测试框架需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter可以做接口测试&#xff1b;Ant是基于Java的构建工具&#xff0c;完成脚本执行并收集结果生成报告&#xff0c;可以跨平台&#xff1b;Jenkins是持续集成工具。将这…

windows下,jmeter+jenkins+ant接口自动化测试环境搭建

&#xff08;一&#xff09;jdk安装与配置 利用jmeter进行接口自动化&#xff0c;需要用到jdk&#xff0c;因此需要下载并安装jdk&#xff0c;下载jdk并配置好环境变量&#xff08;可参考网上教程&#xff09; &#xff08;二&#xff09;ant安装与配置 1.下载ant&#xff0…

Jmeter+Jenkins+Ant接口自动化测试平台搭建(Mac)输出测试报告(二)

1、首先将apache-jmeter-3.2extras下面的ant-jmeter-1.1.1的jar包复制到ant的lib目录下 复制到你安装ant目录下的lib文件里(这里就不贴图里) /usr/local/Cellar/ant/1.10.6/libexec/lib 提示&#xff1a;如果大家下载完ant后找不到路径&#xff0c;可以在终端输入命令&#x…

用JMeter+ANT进行接口自动化测试,并生成HTML测试报告

前言 小伙伴们&#xff0c;用python做接口自动化是不是写代码比较繁琐&#xff0c;而且没有python代码基础的小伙伴根本无从下手对吧&#xff01;今天我们来学习一下如何使用JMeter工具实现接口自动化测试。 安装 1、安装JDK&#xff0c;配置java环境变量&#xff08;安装过程…