目录

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

C语言:字符数组的输入输出相关推荐

  1. C语言字符数组的输入输出

    可以在初始定义字符数组时进行赋值,例如char c[]={"China"}; 或者用strcpy函数 例如char c[20]; strcpy(c,"China" ...

  2. C语言字符数组的输入输出处理

    字符数组就是char数组,当维度是一维是可以当做"字符串",当维度是二维时可以当成是字符串数组,即若干字符串.字符数组的输入除了使用scanf外,还可以使用getchar或者get ...

  3. C语言 | 字符数组

    C语言字符数组的定义 字符数组是用来存放字符数据的数组,字符数组中的一个元素存放一个字符,定义字符数组的方法和定义数值型数组的方法类似. //例子:char character[10]; C语言字符数 ...

  4. strcmp可以比较数组么_6.3 C语言字符数组

    01字符数组的定义 1.用来存放字符数据的数组是字符数组.字符数组中的一个元素存放一个字符. 2.定义字符数组的方法和定义数值型数组的方法类似. 例子: char c[10]; 02 字符数组的初始化 ...

  5. C语言字符数组的输入和输出

    字符数组的输入输出有两种方法: (1)逐个字符输入输出.用格式符"%c"输入或输出一个字符.例如 int main() {char c[6]; //定义一个字符串for (int ...

  6. C/C++ | C语言字符数组初始化,有些赋值方式千万注意

    一.字符数组的定义和初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. charstr[10]={'I','','a','m','','h','a','p','p','y'}; ...

  7. C语言 字符数组 和 字符串 详解

    C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ...

  8. C语言字符数组越界问题

    C语言字符数组踩坑 如果运行下面的代码会发生输出什么? #include<stdio.h> #include<string.h>/*** 输出结果* a1:wohello* a ...

  9. c语言字符数组赋值超过,C语言字符数组赋值

    C语言字符数组赋值教程 C语言字符数组赋值详解 语法 arr[index] = value; 参数 参数 描述 arr 数组名. index 需要赋值的下标索引. value 需要设置的值. 说明 给 ...

  10. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

最新文章

  1. 利用NPP-VIIRS夜光数据识别中国收缩城市
  2. 【C 语言】文件操作 ( 文件加密解密 | 加密文件 )
  3. win10 mysql5.5无响应_Win10安装mysql5.5安装最后一步停住卡死未响应的解决方法
  4. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道
  5. android服务下载,android服务之bindService和unService中下载任务中的应用
  6. Windows Phone 7 Developer Tools amp; Training Kit 正式版发布!
  7. 罗森伯格荣获2015年度中国数据中心优秀供应商与中国十大布线品牌两项大奖
  8. mysql中的replication_MySQL Replication(主从服务器)配置实例
  9. 牛逼神器第三弹--nth_element函数
  10. 操作系统之课程设计常用磁盘调度算法的实现,附源码
  11. 操作系统之多道程序设计
  12. 专利挖掘和撰写(京东技术资质申请和创造专利挖掘)
  13. 哪个大佬有c#三层架构写的餐饮管理系统源代码
  14. 美国大学计算机专业排名 圣地亚哥,U.S.News美国大学计算机专业排名
  15. 2020年8月4日王者服务器维修,2020年8月4日小鸡正确的答案
  16. Designing Network Design Spaces,译读
  17. sqli-lab教程Less-5
  18. 沈阳城市学院计算机,喜讯:沈阳城市学院21个代表队在2019全国计算机大赛中全部获奖...
  19. 计算机二级打字的速度有要求么,打字速度几个要求和技巧
  20. 腾讯云服务器备案要多久?腾讯云小程序备案流程

热门文章

  1. 计算机ping使用的端口,Win7系统中如何Ping端口?Ping端口命令的用法
  2. Fanuc机器人从控制柜导出GSD文件
  3. Active Directory攻防实验室环境搭建教程(一)
  4. 华为交换机初始化和配置SSH和TELNET远程登录方法
  5. 头歌平台-人工智能之AlphaBeta剪枝算法
  6. 移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落
  7. cad计算机快捷键命令大全,cad快捷键命令有哪些?常用cad快捷键命令大全
  8. 工业机器人 郝卫东_基于S3C2410的视觉巡线机器人系统设计
  9. 蔡勒公式与Python
  10. 图解电动汽车:电动汽车关键技术