实现如下两个函数(不调用库函数):
int myStrLen(char *s);
该函数功能为求字符串s的长度。
void myStrConcat(char *string1, char *string2);
该函数的功能为将字符串string2拼接至字符串string1后边。
注意: 该函数的两个参数,在调用时有可能会指向同一个字符串,函数需要在这种情况下能正确完成指定的功能。
主函数要求使用以上两个函数实现如下功能:
输入:
第一行为三个整数 n( 0 < n < 10 ), a, b, 第二行为n个整数,后边为n行字符串,每个字符串长度不超过20。
输出:
- 要求首先将第 b 行字符串拼接至第 a 行的字符串后再输出。
- 第一行为 n 个用单个空格分隔的整数(最后一个数后无空格),为按各字符串的输入次序输出的各字符串的长度。
- 后边 n 行为将输入的字符串按输入的第 2 行给出的顺序依次输出。
- 输入保证合法且字符串中不包含空格。
#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;
}