本文主要是介绍寒假作业Day 04,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
寒假作业Day 04
一、选择题
首先我们分析一下,char *str[3]是字符指针数组,其三个字符指针分别指向"stra",“strb”,“strc”,而char *p则是字符指针,被赋值stra字符串的首地址,所以一开始输出的是stra,而p++之后则是跳过一个字符的位置,输出tra,最后输出ra
故输出结果为stra tra ra
2、下列代码输出的结果是什么( )
#include <stdio.h>
int main() {
int m[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int(*p)[4] = (int(*)[4])m;
printf("%d", p[1][2]);
return 0;
}
首先创建了一个整形数组m,存储了10个元素;
3、下列程序的输出结果是( )
int main()
{char p1[15]="abcd", *p2="ABCD", str[50]="xyz";strcpy(str + 2, strcat(p1+2, p2+1));printf("%s", str);return 0;
}
strcpy是一个拷贝函数,用于复制一个字符串到另一个字符串后,strcat则是一个拼接函数,将两个函数拼接起来
p1+2的位置在cd,而p2+1则是BCD,所以strcat的结果就是cdBCD,而str+2的位置则是z,拷贝则是从z的位置开始,于是z变成cdBCD,所以最后str就变成了xycdBCD
A:错误。字符串不可以用关系运算符进行大小比较,而是strcmp
B:错误。返回的是字符串中的元素个数,而不是内存大小
C: 正确。C语言标准库中提供了一系列字符串处理函数(如strcpy, strcat, strlen等),但并没有为字符串定义特殊的运算符来进行整体操作。字符串在C语言中通常是通过字符数组来表示的,对字符串的操作主要通过这些库函数来实现。
D: 错误。当拼接两个字符串时,结果字符串占用的内存空间应该是两个原串长度之和再加上1(为了存储结尾的空字符\0)。如果原句指的是两个原串各自占用的内存块大小的和,那么这并不准确,因为拼接后的字符串需要一个连续的内存空间来存储,这个空间大小等于两个原串字符数总和加1。
5、程序的结果是什么( )
#include<stdio.h>
char* f(char* str, char ch)
{char* it1 = str;char* it2 = str;while(*it2 != '\0'){while (*it2 == ch){it2++;}*it1++ = *it2++;}return str;
}
int main()
{char a[10];strcpy(a, "abcdcccd");printf("%s", f(a, 'c'));return 0;
}
先看主函数,strcpy,字符数组a中copy了abcdcccd8个元素,故a中的元素是就是abcdcccd,接下来我们分析f这个函数
it2与it1指针都是指向str函数的首地址,外面套一个while循环,当it2走向str的结尾时结束;而里面嵌套的一个循环,则是在*it2指向的元素==ch时才会触发it2++,而一直会实现的代码是it2当前位置的元素赋值给it1,并两个都向前走。最后it2走到结尾时,返回str。
现在我们看看f(a,‘c’),str就是abcdcccd的首地址,ch=‘c’,it2走到c的时候,it2会额外++,我们把过程都详细说说
it2a b c d c c c d
it1it2a b c d c c c dit1it2a b c d c c c dit1it2a b d d c c c dit1it2a b d d c c c dit1it2a b d d c c c d \0it1
it2最后走到\0结束,而最后的数组变成了这个样子,所以最后输出的结果就是abddcccd
二、编程题
#include <stdio.h>
#include<string.h>int main() {int n = 0;scanf("%d", &n);while (n) {char arr[100] = {0};scanf("%s", arr);int len = strlen(arr);if (len >= 10) {printf("%c%d%c\n", arr[0], len - 2, arr[len - 1]);}else{printf("%s\n",arr);}n--;}return 0;
}
我们来解析一下,要求是字母大于等于10个的称作长单词,这就需要用特殊方法来输出,前后是首字符和尾字符,中间是去掉首字符和尾字符的字符个数;而不是长单词的则是直接输出就可以了。
换到程序里,我们首先用scanf输入我们需要的字符串个数,并创建一个while循环用来处理之后的输出;创建一个arr数组用来存储我们的字符串,并用strlen截取长度,如果字符串长度大于10,则用特殊方法输出,如果不是,就直接输出,最后n–。
char* replaceSpaces(char* S, int length){ if (S == NULL) { return NULL;//如果字符串为空} int spaceCount = 0; for (int i = 0; i < length; i++) { if (S[i] == ' ') { spaceCount++;//收集空格个数 } } int newLength = length + 2 * spaceCount; // 每个空格替换为 '%20' char* a = (char*)malloc(sizeof(char) * (newLength + 1)); // +1 为 '\0' if (a == NULL) { perror("malloc fail"); return NULL; } char* p = a;//用来代替a进行处理的 while (*S && p - a < newLength) { if (*S == ' ') { *p++ = '%'; *p++ = '2'; *p++ = '0'; } else { *p++ = *S; } S++; } *p = '\0'; // 添加字符串终止符 return a;
}
这篇关于寒假作业Day 04的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!