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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 逻辑删除还是物理删除

    逻辑删除还是物理删除看到标题,有的童鞋心中暗想“数据删除有什么可提的呢?不就是执行个delete语句吗?有什么难的呀?”其实呢数据删除没有你想的这么简单,一般情况下公司会明确的要求数据只能逻辑删除,不能物理删除。那什么优势逻辑删除,什么又是物理删除呢?物理删除就是我们之前常用的DELETE、TRANCATE、DROP语句删除数据,不管你用哪种方式,都是将数据从硬盘上抹除,这样数据表的体积就变小了,数据的读写性能就提上去了。有个共识InnoDB引擎的数据表记录一旦超过2000万,它的读写性能就很差,我们用物理删除能缩小表

  • mysql自定义函数写法_mysql多实例部署

    mysql自定义函数写法_mysql多实例部署本文实例讲述了mysql自定义函数原理与用法。分享给大家供大家参考,具体如下:本文内容:什么是函数函数的创建函数的调用函数的查看函数的修改函数的删除首发日期:2018-04-18什么是函数:函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。【但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合。】mysql函数有自己…

  • 程序员通过思考和语言改变世界

    程序员通过思考和语言改变世界

  • python写学生信息管理系统代码_学生管理系统源码

    python写学生信息管理系统代码_学生管理系统源码一、前言相信很多小伙伴在学校期间都会被要求实现一个学生管理系统,很多是让用C语言实现,有的是要求Python。这里通过python实现了一个学生管理系统,考试/交作业必备!二、实现效果三、完整源码defindex():”””管理系统主页”””print(“*”*30)print(“Python学生管理系统\n\n1.添加学生的信息\n2.删除学生的信息\n3.修改学生的信息\n4.查询学生的信息\n5.查询所有学生的信息\n6.退出系统

  • sql 四大排名函数—(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    sql 四大排名函数—(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介1.ROW_NUMBER()定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询, 比如查询前10个查询10-100个学生。实例:1.1对学生成绩排序 这里number就是每个学生的序号根据studentScore(分数)进行desc倒序1.2获取第二个同学的成绩信息 这…

  • String字符串截取几种方法

    String字符串截取几种方法String截取字符串publicstaticvoidmain(String[]args){ Stringa="abcd-efg"; Stringa1=a.substring(a.lastIndexOf("-")+1); Stringa2=a.substring(0,a.indexOf("-")); System.out.println(a1);//efg …

发表回复

您的电子邮箱地址不会被公开。

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