C语言——日常刷题(一)

实现如下两个函数(不调用库函数):

int myStrLen(char *s);

该函数功能为求字符串s的长度。

void myStrConcat(char *string1, char *string2);

该函数的功能为将字符串string2拼接至字符串string1后边。
注意: 该函数的两个参数,在调用时有可能会指向同一个字符串,函数需要在这种情况下能正确完成指定的功能。

主函数要求使用以上两个函数实现如下功能:
输入:
第一行为三个整数 n( 0 < n < 10 ), a, b, 第二行为n个整数,后边为n行字符串,每个字符串长度不超过20。

输出:

  1. 要求首先将第 b 行字符串拼接至第 a 行的字符串后再输出。
  2. 第一行为 n 个用单个空格分隔的整数(最后一个数后无空格),为按各字符串的输入次序输出的各字符串的长度。
  3. 后边 n 行为将输入的字符串按输入的第 2 行给出的顺序依次输出。
  4. 输入保证合法且字符串中不包含空格。
#include<stdio.h>

int myStrlen(char s[])  // 传入一个s[]数组
{
	int i, len = 0; // 该变量只在该作用域中有用,当函数结束时,变量就会自动销毁
	for (i = 0; s[i] != '\0'; i++)  // 当s[i] = '\0' 循环结束
		len++;  // 每在 s[]中取到一个值 len +1
	return len; // 循环结束返回len 的值,即数组的长度
}


/*
	将str2指向的字符串连接到str1指向的数组末尾。若str1和str2指向的内存空间重叠,则作未定义处理。
*/
char* myStrConcat(char* str1, char* str2)   // 传入2个字符串参数
{
	char* tmp = str1;
	while (*str1 != '\0')   //当 str1 到末尾则停止循环
	{
		str1++;    // 前进到str1的末尾处
	}
	while ((*str1++ = *str2++) != '\0');  // 循环复制直到遇到 str2中的 ‘\0’
	return tmp;  // 返回 str1的值
}

int main()
{
	/*
		n 数组赋值的个数,例如 n = 1 数组 k[0] 进行赋值 剩余补零,n = 5 数组k [0] k[1] k[2] k[3] k[4] 进行赋值,数组剩余补零
		a 数组中要取的值的下标,不能超过定义数组的长度
		b 数组中要取的值的下标,不能超过定义数组的长度
		i 控制for循环的次数
	*/
	int n, a, b, i; 
	int k[15];    // 定义一个长度为15的数组 
	// char s[10][50] = {}, fu[50] = {}; 
	char s[10][50] = {}; // 定义一个二维数据 10行 50列. 初始值为 0
	char fu[50] = {};  // 定义一个 一维数组 长度 50, 初始值50

	puts("请输入n的值");
	scanf("%d", &n);   // 为n 赋值
	puts("请输入a的值");
	scanf("%d", &a);   // 为a  赋值
	puts("请输入b的值"); 
	scanf("%d", &b);   // 为b 赋值
	// scanf("%d %d %d", &n, &a, &b);
	
	
	puts("请为int类型 数组 k 初始化");
	for (i = 0; i < n; i++)    // k数组的长度 为 k[n],为数组的前n个位置进行赋值,剩余位置全部补零,原数组长度 15。
		scanf("%d", &k[i]);

	puts("请为char类型 数组 s 初始化");
	for (i = 0; i < n; i++)    // s数组的长度 为 s[n],为数组的前n行第一个位置位置进行赋值,剩余位置 默认赋值'\0',原数组长度 15。(例如s[0][0] = 20, s[0][1] = '\0' s[0][2] = '\0', )
		scanf("%s", s[i]);

	// 如果 a的值 不等于 b的值 则调用myStrConcat 函数,对字符串进行拼接将 str2 拼接到 str1后
	if (a != b)
		myStrConcat(s[a], s[b]);  // 将数组第 b 个位置 拼接到 第 a 个位置后面 (例如 s[a]指的是数组的下标,从人的角度去数 位置是a + 1,因为程序的起始位置是从0开始的)
	else if (a == b)   // 如果 a的值 等于 b的值
	{
		for (i = 0; i < myStrlen(s[a]); i++)  // 调用 myStrlen函数 得到 s[a]下标对应值的长度
			fu[i] = s[a][i];   // s[a][i] 当 i大于等于1时,值都是为'\0',只有当 i = 0时,才会有值,初始值赋值n个位置,就有n个值
		myStrConcat(s[a], fu);  // 将fu [] 的值 拼接到 s[a] 的后面的到一个新的 s[a]的值
	}
	puts("打印数组中每一个下标对应的值的长度");
	for (i = 0; i < n; i++)  // 由于 只为s[]数据的前n个位置赋值,所以在这里循环n次
	{
		if (i == 0)
			printf("s[%d] = %d\n", i, myStrlen(s[i])); // 打印数组中每一个下标对应的值的长度(例如:s[0] 长度为1 打印 1,s[5] 长度为7 打印 7,跟数组中具体值没有关系)
		else
			printf("s[%d] = %d\n", i, myStrlen(s[i]));
	}
	printf("\n");


	puts("遍历数组k[]的值");
	for (i = 0; i < n; i++)
		printf("k[%d] = %d\n", i, k[i]);

	puts("遍历数组s[]的值");
	for (i = 0; i < n; i++)
		printf("s[%d] = %s\n", i, s[i]);

	puts("遍历数组s[k[i]]的值");
	for (i = 0; i < n; i++)
		printf("s[%d] = %s\n", i, s[k[i]]);  // 将k[]数组中的值作为 s[]数组的下标, 如果打印为空值,说明s[]对应的下标位置没有进行赋值,默认赋值'\0'


	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44989881/article/details/106685920