《C语言解惑》—— 2.7 别混淆字符数组和字符

简介:

本节书摘来自华章出版社《C语言解惑》一 书中的第2章,第2.7节,作者:刘振安 刘燕君,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.7 别混淆字符数组和字符

【例2.9】下面的程序正确吗?

#include <stdio.h>
void main()
{
     char st[]="When you go home?";
     printf("%s\n",st);        //1
     printf("%c\n",st[5]);    //2
     printf("%s\n",st[5]);    //3
}

【解答】编译能通过,但结果不正确。第1条输出语句中的st代表字符串的首地址,所以能输出字符串的内容。第2条语句的st[5]代表第6个元素y的地址,所以能正确输出“y”。第3条输出语句是错误的,因为%s是输出字符串,要求字符串“you go home?”的首地址。正确的写法是&st[5]。其实,可以简单地使用如下语句
printf(&st[5]);
将这种方法用到程序中。将其改写如下:

#include <stdio.h>
void main()
{
       char st[]="When you go home?";
       printf("%s\n",st);
       printf(st);
       printf("\n"); 
       printf("%c\n",st[5]);
       printf("%s\n",&st[5]);
       printf(&st[5]);
       printf("\n");
}

可以对应下面的输出结果加深对字符串的理解。
When you go home?
When you go home?
y
you go home?
you go home?
当定义字符串
char c[]="abc";
时,其实是由c[0]='a',c[1]='b',c[2]='c',c[3]='0'这4个元素组成。为它分配的长度要增加一位结束符。因此,定义时不能使用
char c[3]="abc";
而要使用
char c[4]="abc";
或者使用
char c[]="abc";
【例2.10】在下面的程序中,输入“You and we”,输出是输入的内容吗?

#include <stdio.h>
void main ( )
{
  char st[32];
  scanf("%s",st);
  printf(st);
  printf("\n");
}

【解答】不是的。输出是“You”。scanf语句的读入是以空格结束的,所以它只取第1个连续字符串作为输入。要想得到正确的结果,就要放弃scanf函数而改用其他函数。例如,使用gets函数。下面是一个正确的程序。

#include <stdio.h>
void main ( )
{
  char st[32];
  printf("输入:");
  gets(st);
  printf("输出:%s\n",st);
}

运行时输入“You and we”,就能保证输出“You and we”。

相关文章
|
29天前
|
C语言
在C语言中数组作为函数参数的应用与示例
在C语言中数组作为函数参数的应用与示例
15 0
|
1月前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
17 0
|
16天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
16天前
|
编译器 程序员 C语言
【C语言】变长数组,二分查找和数组之间自动替换的实现
【C语言】变长数组,二分查找和数组之间自动替换的实现
|
16天前
|
存储 C语言
【C语言数组】创建、初始化、以及使用2
【C语言数组】创建、初始化、以及使用
|
24天前
|
C语言
C语言第二十五弹---字符函数和字符串函数(上)
C语言第二十五弹---字符函数和字符串函数(上)
|
29天前
|
存储 程序员 C语言
C语言中的结构体数组
C语言中的结构体数组
9 0
|
29天前
|
存储 C语言 索引
C语言一维数组
C语言一维数组
13 1
|
1月前
|
存储 编译器 C语言
【c语言 】数组入门
【c语言 】数组入门
29 0
|
1月前
|
存储 搜索推荐 C语言