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

C语言:字符数组的输入输出目录用printf输出用scanf输入用gets输入用puts输出 用printf输出 输出方法1:printf逐个字符输出。  voidmain(void){   charc[ ]="Iamhappy";     inti;      for(i=0;i<10;i++){ …

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

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

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

 scanf(“%s”, c);

//系统自动在China后面加一个’\0’结束符。

printf(“%s”, c);

//按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到’\0’为止。

 

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

 

为什么只输出一个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

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

内存格式不是书上说的那种?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语言:字符数组的输入输出

输入后各个字符数组的状态如下(摘自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

 

下面这个程序是为了验证上面那个内存的存储状态:程序见后面

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

根据上面的输出结果可以看出,不是所有未赋初值的元素都是\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);     
}

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

可以看到,成功解决了scanf遇到空白字符就终止的问题。

 

但是很明显的可以卡到,输入的字符大于10个字符,但是并没有出错,这就说明:

gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输入行。

如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。

 

下面这一段呢,是根据自己之前做的一些工作,见下面。

自己的小疑虑:输入8个字符,为什么不把最后的两个’\0’输出呢?

答案:小傻子,你是用%s输出的字符串,字符串是遇’\0’则止的字符数组,所以就输出有效字符就好了。看下面的例子,我们把字符数组里面所有的字符输出,是不是就有那两个’\0’呢。

 

C语言字符数组与字符串的种种   https://mp.csdn.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); 
}

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157741.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月27日 下午1:00
下一篇 2022年7月27日 下午1:00


相关推荐

  • HOJ 2245 浮游三角胞(数学啊 )

    HOJ 2245 浮游三角胞(数学啊 )

    2022年1月23日
    49
  • Linux系统编程——进程调度浅析「建议收藏」

    Linux系统编程——进程调度浅析

    2022年1月27日
    110
  • 指定TreeNode排序

    指定TreeNode排序button1 Click 调用 My SortTreeNode treeView1 SelectedNode nbsp 选定的节点 右键可以添加排序弹出菜单 nbsp nbsp nbsp nbsp nbsp nbsp nbsp publicintTre TreeNodex TreeNodey nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp TreeNodetx xasTreeNode

    2026年3月19日
    3
  • 数据库系统的三大范式以及BCNF范式详细讲解 (很详细,很详细,很详细)

    首先要明白”范式(NF)”是什么意思。按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多…

    2022年4月8日
    42
  • 现代语音信号处理笔记 (一)

    现代语音信号处理笔记 (一)本系列笔记对胡航老师的现代语音信号处理这本书的语音处理部分进行总结,包含语音信号处理基础、语音信号分析、语音编码三部分。一开始以为三部分总结到一篇文章里就可以了,但写着写着发现事情并没有那么简单。。。因此还是老老实实的总结吧,扎实的基础最重要。语音信号处理基础语音信号的处理简称语音处理,是用数字信号处理技术对语音信号进行处理的一门学科。语音信号均采用数字方式进行处理,语音信号的数字…

    2022年5月26日
    44
  • 最小化安装Centos7后安装图形界面[通俗易懂]

    最小化安装Centos7后安装图形界面[通俗易懂]最小化安装Centos7后安装图形界面:1. 更新下系统yum -y upgradereboot2. 安装依赖包 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel…

    2022年8月18日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号