内容正文:
6.3节:字符数组
一、单项选择题
1.以下代码的输出结果是( )
char str[] = "China";
printf("%d", strlen(str));
A. 4 B. 5 C. 6 D. 不确定
【答案】B
【解析】strlen函数计算字符串长度,不包含结束符\0,"China"有5个字符,故长度为5。
2.执行以下代码后,str的内容是( )
char str[10] = "abc";
strcat(str, "def");
A. "abcdef" B. "abc def" C. "defabc" D. "abc"
【答案】A
【解析】strcat函数将第二个字符串连接到第一个字符串的末尾,"abc"后连接"def",结果为"abcdef"。
3.以下能正确比较两个字符串s1和s2是否相等的语句是( )
A. if(s1 == s2) B. if(strcmp(s1, s2) == 0)
C. if(strcpy(s1, s2)) D. if(strlen(s1) == strlen(s2))
【答案】B
【解析】字符串比较需用strcmp函数,返回值为0表示相等;A选项比较的是数组首地址,不是内容;C选项是复制字符串;D选项比较长度,长度相等内容不一定相等。
4.定义字符数组char str[5];,以下输入语句正确的是( )
A. scanf("%s", &str); B. scanf("%s", str);
C. gets(&str); D. getchar(str);
【答案】B
【解析】字符数组名str表示数组首地址,scanf("%s", str)正确;A选项&str是数组的地址,类型不符;gets的参数是数组首地址,无需&;getchar无参数。
5.以下代码的输出结果是( )
char str[] = "Hello";
puts(str);
A. Hello(无换行) B. Hello(有换行)
C. Hello\0 D. 编译错误
【答案】B
【解析】puts函数输出字符串后会自动换行,故输出"Hello"并换行。
6.以下代码的输出结果是( )
char s1[10] = "abc", s2[10] = "abd";
printf("%d", strcmp(s1, s2));
A. 正数 B. 负数 C. 0 D. 1
【答案】B
【解析】strcmp比较字符串,s1的第三个字符'c'(ASCII码99)小于s2的第三个字符'd'(ASCII码100),返回负数。
7.以下代码的输出结果是( )
char str[20] = "I love";
strcat(str, " C");
printf("%s", str);
A. I love C B. I loveC C. C I love D. I love
【答案】A
【解析】strcat将" C"连接到"I love"后,结果为"I love C"。
8.以下代码的输出结果是( )
char str[] = "12345";
printf("%d", sizeof(str));
A. 5 B. 6 C. 4 D. 不确定
【答案】B
【解析】sizeof计算数组总字节数,"12345"有5个字符加1个\0,共6字节。
9.字符数组str初始化为char str[5] = "abc";,则str[3]的值是( )
A. 'a' B. 'b' C. '\0' D. 'c'
【答案】C
【解析】"abc"存储在数组中为{'a','b','c','\0'},str[3]是第四个元素,即\0。
10.若有定义char str[20];,要输入字符串"I love C",以下输入方式正确的是( )
A. scanf("%s", str); B. gets(str);
C. scanf("%c", str); D. getchar(str);
【答案】B
【解析】字符串包含空格时,scanf("%s")会在空格处停止读取,因此 A 选项无法读取完整字符串;gets()函数可读取包含空格的字符串,B 选项正确;C、D 选项用于读取单个字符,无法读取字符串。
二、填空题。
1.字符数组str定义为char str[10];,若输入字符串"test",则str[4]的值是___________。
【答案】\0
【解析】"test"有4个字符,存储为{'t','e','s','t','\0'},str[4]是第五个元素,即字符串结束符。
2.函数______用于将字符串s2连接到s1的末尾。
【答案】strcat
【解析】strcat函数的功能是字符串连接。
3.若要通过键盘输入一个含空格的字符串到字符数组str,应使用函数___________。
【答案】gets
【解析】gets可输入含空格的字符串,scanf("%s")遇空格停止。
4.函数______用于比较两个字符串s1和s2,若s1小于s2,返回值为___________。
【答案】strcmp;负数
【解析】strcmp比较字符串,s1<s2时返回负数。
5.若有定义char str1[20] = "hello", str2[] = " world";,执行strcat(str1, str2);后,strlen(str1)的值是___________。
【答案】11
【解析】拼接后的字符串为"hello world",有效字符数为 11(h~d共 11 个字符,不含\0),因此strlen(str1)的值为 11。
6.以下程序段中,puts()函数的输出结果是___________。
char str[] = {'h', 'e', 'l', 'l', 'o', '\0', 'w', 'o', 'r', 'l', 'd'};
puts(str);
【答案】hello
【解析】puts()输出字符串时遇到第一个\0就停止,因此只会输出\0之前的"hello"。
7.若有定义char str1[] = "test", str2[10];,以下能正确将str1的字符串复制到str2中的语句是___________。
【答案】strcpy(str2, str1);
【解析】strcpy()可正确复制字符串。
8.字符串常量"programming"在内存中存储时,末尾会自动添加字符______作为结束标志。
【答案】\0
【解析】C 语言中所有字符串都以\0(ASCII 码为 0 的空字符)作为结束标志,用于标识字符串的终止位置。
9.strcpy(str1, str2)函数的作用是将字符串______复制到字符数组______中(填写 str1 或 str2)。
【答案】str2;str1
【解析】strcpy()函数的参数顺序为目标数组在前、源字符串在后,因此将str2复制到str1中。
10.若要将单个字符'A'输入到字符数组str[0]中,可使用语句scanf("%c", ______);。
【答案】&str[0]
【解析】scanf()读取单个字符时,需传入字符变量的地址,因此取str[0]的地址&str[0]。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char str[] = "hello";
printf("%d", strlen(str));
}
【答案】5
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char str[10];
int i;
for(i=0; i<5; i++) {
str[i] = 'a' + i;
}
str[5] = '\0';
printf("%s", str);
}
【答案】abcde
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char s1[] = "longstring", s2[] = "short";
if(strcmp(s1, s2) > 0)
printf("s1 is longer");
else
printf("s2 is shorter or equal");
}
【答案】s2 is shorter or equal
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char str[] = "ABCD";
int i;
for(i = 0; str[i] != '\0'; i++)
{
printf("%d", str[i] - 'A');
}
}
【答案】0123
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "C Language";
int i, len = strlen(s);
for(i = len - 1; i >= 0; i--)
{
if(s[i] == ' ')
continue;
printf("%c", s[i]);
}
}
【答案】egaugnaLC
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "a1B2c3";
int i, c = 0;
for(i = 0; s[i] != '\0'; i++) {
if(s[i] >= 'a' && s[i] <= 'z') c++;
}
printf("%d", c);
}
【答案】2
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "XYZ";
int i;
for(i = 0; s[i] != '\0'; i++) {
s[i] = s[i] - 1;
}
printf("%s", s);
}
【答案】WXY
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "12345";
int i, sum = 0;
for(i = 0; s[i] != '\0'; i++) {
sum = sum * 10 + (s[i] - '0');
}
printf("%d", sum + 1);
}
【答案】12346
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "0000";
int i;
for(i = 0; i < 3; i++)
{
s[i] = s[i+1] + 1;
}
printf("%s", s);
}
【答案】1110
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "dbca";
char max = s[0];
int i;
for(i = 1; s[i] != '\0'; i++)
{
if(s[i] > max)
max = s[i];
}
printf("%c", max);
}
【答案】d
四、程序填空题(根据题意,将空缺的语句补上)
1.下列程序的功能是:计算字符串长度(不使用strlen)。
#include <stdio.h>
main() {
char str[80];
int len = 0;
scanf("%s", str);
while (__________) {
len++;
}
printf("%d", len);
}
【答案】str[len] != '\0' 或 str[len]
2.下列程序的功能是:统计数字字符个数。
#include <stdio.h>
main() {
char s[] = "a1b2c3";
int i, count = 0;
for(i = 0; s[i] != '\0'; i++) {
if (__________) {
count++;
}
}
printf("%d", count);
}
【答案】s[i] >= '0' && s[i] <= '9'
3.下列程序的功能是:将小写字母转换为大写。
#include <stdio.h>
main() {
char s[] = "hello";
int i = 0;
while(s[i] != '\0') {
if(s[i] >= 'a' && s[i] <= 'z') {
__________;
}
i++;
}
printf("%s", s);
}
【答案】s[i] = s[i] - 32;
4.下列程序的功能是:判断是否为回文。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "aba";
int i, flag = 1;
int len = strlen(s);
for(i = 0; i < len/2; i++) {
if(__________) {
flag = 0;
break;
}
}
printf("%d", flag);
}
【答案】s[i] != s[len-1-i]
5.下列程序的功能是:字符串逆序(首尾交换)。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "abcd";
int i, j;
char temp;
j = strlen(s) - 1;
for(i = 0; i < j; i++, j--) {
temp = s[i];
s[i] = s[j];
__________;
}
printf("%s", s);
}
【答案】s[j] = temp;
五、编程题。
1. 有两个字符串 str1 和 str2。编写程序,将 str2 中的内容插入到 str1 中下标为 k 的位置(假设 str1 足够大)。
输入样例:(输入第一行是str1,第二行是str2,第三行是整数k)
HelloWorld
123
5
输出样例:
Hello123World
【参考代码】
#include <stdio.h>
#include <string.h>
main() {
char str1[200], str2[100];
int k, i, len1, len2;
scanf("%s", str1);
scanf("%s", str2);
scanf("%d", &k);
len1 = strlen(str1);
len2 = strlen(str2);
// 1. 将str1中从下标k开始的字符向后移动len2个位置
// 注意要从后往前移,防止数据覆盖
for (i = len1; i >= k; i--) {
str1[i + len2] = str1[i];
}
// 2. 将str2的内容复制到str1的空出的位置
for (i = 0; i < len2; i++) {
str1[k + i] = str2[i];
}
printf("%s", str1);
}
2.输入一行英文句子(仅包含字母和空格,单词之间用空格隔开),找出其中最长的单词并输出。如果有多个长度相同的最长单词,输出第一个。
输入样例:
I love C programming language
输出样例:
programming
【参考代码】
#include <stdio.h>
#include <string.h>
main() {
char str[200];
char maxWord[50] = "";
char temp[50];
int i = 0, j = 0;
int maxLen = 0;
gets(str); // 读取整行
while (str[i] != '\0') {
// 如果不是空格,存入临时数组
if (str[i] != ' ')
temp[j++] = str[i];
else {
// 遇到空格,说明一个单词结束
temp[j] = '\0';
if (j > maxLen) {
maxLen = j;
strcpy(maxWord, temp);
}
j = 0; // 重置临时数组下标
}
i++;
}
// 处理最后一个单词(因为句子末尾可能没有空格)
temp[j] = '\0';
if (j > maxLen) {
strcpy(maxWord, temp);
}
printf("%s", maxWord);
}
3.编写程序,对输入的字符串进行压缩。压缩规则是:如果某个字符连续出现多次,则输出该字符加上出现的次数;如果只出现一次,则只输出该字符。
输入样例:
aaabbccccda
输出样例:
a3b2c4d1a1
【参考代码】
#include <stdio.h>
main() {
char str[100];
int i = 0, count;
scanf("%s", str);
while (str[i] != '\0') {
count = 1;
// 统计当前字符连续出现的次数
while (str[i] == str[i + 1]) {
count++;
i++;
}
printf("%c%d", str[i], count);
i++;
}
}
4.输入两个字符串 str 和 sub。编写程序查找 sub 在 str 中第一次出现的位置(下标)。如果不存在,输出 -1。
输入样例:
abcdefg
cde
输出样例:
2
【参考代码】
#include <stdio.h>
#include <string.h>
main() {
char str[100], sub[50];
int i, j, k;
int lenStr, lenSub;
int found = -1;
scanf("%s", str);
scanf("%s", sub);
lenStr = strlen(str);
lenSub = strlen(sub);
// 遍历主串,注意边界是 lenStr - lenSub
for (i = 0; i <= lenStr - lenSub; i++) {
// 假设从i开始匹配
for (j = 0; j < lenSub; j++) {
if (str[i + j] != sub[j]) {
break; // 匹配失败
}
}
// 如果j走到了sub的末尾,说明全部匹配成功
if (j == lenSub) {
found = i;
break;
}
}
printf("%d", found);
}
5.输入5个字符串(每个字符串长度不超过20),将它们按字典序(从小到大)排序并输出。
【参考代码】
#include <stdio.h>
#include <string.h>
main() {
char str[5][21]; // 5个字符串,每个最多20字符+1个'\0'
char temp[21];
int i, j;
// 输入
for (i = 0; i < 5; i++)
scanf("%s", str[i]);
// 冒泡排序
for (i = 0; i < 4; i++) {
for (j = 0; j < 4 - i; j++) {
// strcmp > 0 表示前一个比后一个大,需要交换
if (strcmp(str[j], str[j + 1]) > 0) {
strcpy(temp, str[j]);
strcpy(str[j], str[j + 1]);
strcpy(str[j + 1], temp);
}
}
}
// 输出
for (i = 0; i < 5; i++)
printf("%s
", str[i]);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
6.3节:字符数组
一、单项选择题
1.以下代码的输出结果是( )
char str[] = "China";
printf("%d", strlen(str));
A. 4 B. 5 C. 6 D. 不确定
2.执行以下代码后,str的内容是()
char str[10] = "abc";
strcat(str, "def");
A. "abcdef" B. "abc def" C. "defabc" D. "abc"
3.以下能正确比较两个字符串s1和s2是否相等的语句是()
A. if(s1 == s2) B. if(strcmp(s1, s2) == 0)
C. if(strcpy(s1, s2)) D. if(strlen(s1) == strlen(s2))
4.定义字符数组char str[5];,以下输入语句正确的是()
A. scanf("%s", &str); B. scanf("%s", str);
C. gets(&str); D. getchar(str);
5.以下代码的输出结果是()
char str[] = "Hello";
puts(str);
A. Hello(无换行) B. Hello(有换行)
C. Hello\0 D. 编译错误
6.以下代码的输出结果是()
char s1[10] = "abc", s2[10] = "abd";
printf("%d", strcmp(s1, s2));
A. 正数 B. 负数 C. 0 D. 1
7.以下代码的输出结果是()
char str[20] = "I love";
strcat(str, " C");
printf("%s", str);
A. I love C B. I loveC C. C I love D. I love
8.以下代码的输出结果是()
char str[] = "12345";
printf("%d", sizeof(str));
A. 5 B. 6 C. 4 D. 不确定
9.字符数组str初始化为char str[5] = "abc";,则str[3]的值是()
A. 'a' B. 'b' C. '\0' D. 'c'
10.若有定义char str[20];,要输入字符串"I love C",以下输入方式正确的是()
A. scanf("%s", str); B. gets(str);
C. scanf("%c", str); D. getchar(str);
二、填空题。
1.字符数组str定义为char str[10];,若输入字符串"test",则str[4]的值是___________。
2.函数______用于将字符串s2连接到s1的末尾。
3.若要通过键盘输入一个含空格的字符串到字符数组str,应使用函数___________。
4.函数______用于比较两个字符串s1和s2,若s1小于s2,返回值为___________。
5.若有定义char str1[20] = "hello", str2[] = " world";,执行strcat(str1, str2);后,strlen(str1)的值是___________。
6.以下程序段中,puts()函数的输出结果是___________。
char str[] = {'h', 'e', 'l', 'l', 'o', '\0', 'w', 'o', 'r', 'l', 'd'};
puts(str);
7.若有定义char str1[] = "test", str2[10];,以下能正确将str1的字符串复制到str2中的语句是___________。
8.字符串常量"programming"在内存中存储时,末尾会自动添加字符______作为结束标志。
9.strcpy(str1, str2)函数的作用是将字符串______复制到字符数组______中(填写 str1 或 str2)。
10.若要将单个字符'A'输入到字符数组str[0]中,可使用语句scanf("%c", ______);。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char str[] = "hello";
printf("%d", strlen(str));}
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char str[10];
int i;
for(i=0; i<5; i++) {
str[i] = 'a' + i; }
str[5] = '\0';
printf("%s", str);}
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char s1[] = "longstring", s2[] = "short";
if(strcmp(s1, s2) > 0)
printf("s1 is longer");
else
printf("s2 is shorter or equal");}
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char str[] = "ABCD";
int i;
for(i = 0; str[i] != '\0'; i++)
{ printf("%d", str[i] - 'A'); }
}
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "C Language";
int i, len = strlen(s);
for(i = len - 1; i >= 0; i--)
{ if(s[i] == ' ')
continue;
printf("%c", s[i]); }}
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "a1B2c3";
int i, c = 0;
for(i = 0; s[i] != '\0'; i++) {
if(s[i] >= 'a' && s[i] <= 'z') c++; }
printf("%d", c);}
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "XYZ";
int i;
for(i = 0; s[i] != '\0'; i++) {
s[i] = s[i] - 1; }
printf("%s", s);}
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "12345";
int i, sum = 0;
for(i = 0; s[i] != '\0'; i++) {
sum = sum * 10 + (s[i] - '0');}
printf("%d", sum + 1);}
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "0000";
int i;
for(i = 0; i < 3; i++)
{ s[i] = s[i+1] + 1; }
printf("%s", s);}
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
char s[] = "dbca";
char max = s[0];
int i;
for(i = 1; s[i] != '\0'; i++)
{ if(s[i] > max)
max = s[i]; }
printf("%c", max);}
四、程序填空题(根据题意,将空缺的语句补上)
1.下列程序的功能是:计算字符串长度(不使用strlen)。
#include <stdio.h>
main() {
char str[80];
int len = 0;
scanf("%s", str);
while (__________) {
len++;
}
printf("%d", len);
}
2.下列程序的功能是:统计数字字符个数。
#include <stdio.h>
main() {
char s[] = "a1b2c3";
int i, count = 0;
for(i = 0; s[i] != '\0'; i++) {
if (__________) {
count++;
}
}
printf("%d", count);
}
3.下列程序的功能是:将小写字母转换为大写。
#include <stdio.h>
main() {
char s[] = "hello";
int i = 0;
while(s[i] != '\0') {
if(s[i] >= 'a' && s[i] <= 'z') {
__________;
}
i++;
}
printf("%s", s);
}
4.下列程序的功能是:判断是否为回文。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "aba";
int i, flag = 1;
int len = strlen(s);
for(i = 0; i < len/2; i++) {
if(__________) {
flag = 0;
break;
}
}
printf("%d", flag);
}
5.下列程序的功能是:字符串逆序(首尾交换)。
#include <stdio.h>
#include <string.h>
main() {
char s[] = "abcd";
int i, j;
char temp;
j = strlen(s) - 1;
for(i = 0; i < j; i++, j--) {
temp = s[i];
s[i] = s[j];
__________; }
printf("%s", s);
}
五、编程题。
1. 有两个字符串 str1 和 str2。编写程序,将 str2 中的内容插入到 str1 中下标为 k 的位置(假设 str1 足够大)。
输入样例:(输入第一行是str1,第二行是str2,第三行是整数k)
HelloWorld
123
5
输出样例:
Hello123World
2.输入一行英文句子(仅包含字母和空格,单词之间用空格隔开),找出其中最长的单词并输出。如果有多个长度相同的最长单词,输出第一个。
输入样例:
I love C programming language
输出样例:
programming
3.编写程序,对输入的字符串进行压缩。压缩规则是:如果某个字符连续出现多次,则输出该字符加上出现的次数;如果只出现一次,则只输出该字符。
输入样例:
aaabbccccda
输出样例:
a3b2c4d1a1
4.输入两个字符串 str 和 sub。编写程序查找 sub 在 str 中第一次出现的位置(下标)。如果不存在,输出 -1。
输入样例:
abcdefg
cde
输出样例:
2
5.输入5个字符串(每个字符串长度不超过20),将它们按字典序(从小到大)排序并输出。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$