寒假作业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个元素;
定义了一个名为p的指针,该指针指向一个包含4个整数的数组。然后,它尝试将m数组的地址转换为int(*)[4]类型的指针,并将转换后的地址赋值给p。
试图打印p[1][2]的值。由于p是一个指向包含4个整数的数组的指针,p[1]将指向m数组中从第5个元素开始的4个元素的子数组,即{5, 6, 7, 8}。因此,p[1][2]将访问这个子数组的第3个元素,即7。

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会额外++,我们把过程都详细说说

it2
 a   b   c   d   c   c   c   d
it1

        it2
 a   b   c   d   c   c   c   d
        it1

          	it2
 a   b   c   d   c   c   c   d
        it1

          	it2
 a   b   d   d   c   c   c   d
        it1
        
         					it2
 a   b   d   d   c   c   c   d
        	it1

         						it2
 a   b   d   d   c   c   c   d	\0
        		it1

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;  
}
  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值