字符数组
字符数组是元素的数据类型为字符类型的数组。
初始化
注意:' \0 '的ASCII码值 : 0。
#include<stdio.h>
int main()
{
char ch[5] = { 'B','O','Y'};
int n;
int i;
n = sizeof(ch) / sizeof(char);
printf("sizeof = %d\n", n);
for (i = 0; i < n; i++)
{
printf("%c ", ch[i]);
}
putchar('\n');
for (i = 0; i < n; i++)
{
printf("%d ", ch[i]);
}
return 0;
}
//sizeof = 5
//B O Y
//66 79 89 0 0
字符串
C语言中无字符串变量,一般用字符数组处理字符串。
字符串结束标志:‘\0’。
初始化
#include<stdio.h>
int main()
{
//初始化:(注意预留一个'\0')
char ch[6] = "hello";
int i = 0;
//打印的两种方式:
//1.
printf("%s\n", ch);
//2.
for (i = 0; i < 6; i++)
{
printf("%c", ch[i]);
}
return 0;
}
问题引入
从键盘上输入字符串并输出:Hello world!
#include<stdio.h>
#define _CRT_SECURE_NO_DEPRECATE;
int main()
{
char ch[80];
scanf("%s", ch);
printf("%s\n", ch);
return 0;
}
//输入:hello world
//输出:hello
问题:为什么输入hello world 输出 hello?
原因:scanf 遇到空格会停止。
解决方法:
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[80];
scanf("%[^\n]",ch);
printf("%s\n", ch);
return 0;
}
//输入:hello world
//输出:hello world
字符串输入函数
只需要了解,不建议使用。
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[30];
fgets(ch);
printf("%s\n", ch);
return 0;
}
//输入:hello world
//输出:hello world
字符串输出函数
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[4] = { 'a','b','c' };
char ch1[30] = "hello world";
puts(ch);
puts(ch1);
return 0;
}
//输出结果:
//abc
//hello world
注意:puts默认换行。
“puts和putchar的区别:
- puts:输出的是字符串,包括字符串中的所有字符,直到遇到
\0
为止,并在末尾自动添加换行符。 - putchar:输出的是单个字符,无论是字符常量、变量还是表达式的结果,都只能输出一个字符。”
字符、字符串综合举例
如果想打印字符数组,不要使用 %s 。
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch1[6] = "hello";
char ch2[] = { 'a','b','c' };
printf("%s %p\n", ch1, ch1);
printf("%s %p\n", ch2, ch2[0]);
return 0;
}
//输出结果:
//hello 000000E7EE2FFA14
//abc烫烫烫烫烫烫烫烫烫烫烫烫蘌畳r 0000000000000061
因为字符串以 ' \0 '结尾。
二维字符数组
问题引入
1.输出以下图形:
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[][5] = { {'.','.','*'},{'.','*','.','*'},{'*','.','.','.','*'},{'.','*','.','*'} ,{'.','.','*'} };
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%c ", ch[i][j]);
}
putchar('\n');
}
return 0;
}
2.输出以下:
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[][7] = { "apple","orange","grade","pear" ,"peach"};
int i, j;
for (i = 0; i < 5; i++)
{
printf("%s ", ch[i]);
}
return 0;
}
回到题目1:
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[][5] = { {'.','.','*'},{'.','*','.','*'},{'*','.','.','.','*'},{'.','*','.','*'} ,{'.','.','*'} };
int i, j;
for (i = 0; i < 5; i++)
{
printf("%s\n", ch[i]);
}
return 0;
}
//输出结果:
//..*
//.*.*
//*...*.*.*
//.*.*
//..*
是因为字符串的输出是以 ‘ \0 ’ 为结束条件的,而第三行并没有给‘ \0 ’ 预留空间。所以出现以上情况。
解决方法:给第三行预留空间。
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
char ch[][7] = { {'.','.','*'},{'.','*','.','*'},{'*','.','.','.','*'},{'.','*','.','*'} ,{'.','.','*'} };
int i, j;
for (i = 0; i < 5; i++)
{
printf("%s\n", ch[i]);
}
return 0;
}
//输出结果:
//..*
//.*.*
//*...*
//.*.*
//..*