|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
基础要求:使用 fgets 函数接收用户输入的两个字符串到 str1 和 str2 中,将 str2 连接到 str1 后边,并打印出来。
进阶要求:实现 strncat 函数,让用户输入需要连接到 str1 后边的字符个数(注意:该程序需要能够正确拷贝中英混合的字符串)
进阶要求代码如下:
#include <stdio.h>
#define MAX 1024
int main()
{
char str1[2 * MAX]; // 确保连接后不越界
char str2[MAX];
char *target1 = str1;
char *target2 = str2;
char ch;
int n;
printf("请输入第一个字符串:");
fgets(str1, MAX, stdin);
printf("请输入第二格字符串:");
fgets(str2, MAX, stdin);
printf("请输入需要连接的字符个数:");
scanf("%d", &n);
// 将指针指向 str1 的末尾处
while (*target1++ != '\0')
;
// 我们希望 str1 最后边的 '\0' 和 '\n' 都被覆盖掉
target1 -= 2;
while (n--)
{
ch = *target1++ = *target2++;
if (ch == '\0')
{
break;
}
if ((int)ch < 0)
{
*target1++ = *target2++;
*target1++ = *target2++;
}
}
*target1 = '\0';
printf("连接后的结果是:%s\n", str1);
return 0;
}
对于上面的代码我有2点不清楚。第一点是“while(n--)”代表什么? 第二点是整段代码中我只能读出来*target1++=*target2++,直译出来应该就是str1=str2,但是却读不出来他们二者相连的代码味道。它们实现相连的地方是从“printf("请输入需要连接的字符个数:");
scanf("%d", &n);”这里开始实现的吗?整体又是怎么实现的呢。在此先谢谢大神们对小白的指导
对于你的第一个问题, while(n--) 这是一个循环,会持续进行,直到 n 变为 0 。初始的 n 值是用户输入的连接字符的个数。在这个循环中, n-- 的意思是 n 的值在每次循环之后会减一。当 n 变为 0 时,循环就会停止。
对于第二个问题, *target1++ = *target2++ 是将 str2 的内容添加到 str1 的尾部。在这行代码中, *target1++ 和 *target2++ 分别表示 str1 和 str2 的当前字符。 *target1++ = *target2++ 的意思是把 str2 的当前字符复制到 str1 的当前位置,并且 str1 和 str2 的指针都向前移动一位,以便在下一次循环中处理下一个字符。
关于代码的实现逻辑,首先,用户被询问输入两个字符串 str1 和 str2 ,以及一个数字 n 。字符串 str1 和 str2 分别被存储在 target1 和 target2 中,数字 n 是要复制的字符数。
然后,程序将 target1 的位置移动到 str1 的末尾(由 while (*target1++ != '\0') 循环实现)。注意,这里 target1 的位置最后被再向回移动两位,以覆盖 str1 的末尾的 '\0'(字符串结束标志)和 '\n'(可能存在的换行符)。
最后,程序开始复制 str2 的前 n 个字符到 str1 的末尾。 while (n--) 循环负责这个过程。在每次循环中,从 str2 复制一个字符到 str1 ,直到复制了 n 个字符,或者遇到 str2 的结束标志 '\0'。并且,如果遇到一个字符的 ASCII 值为负数,那么接下来的两个字符也会被复制,这是因为在 UTF-8 编码中,一个非英文字符可能会被编码为多个字节,所以这部分代码能够正确处理中英文混合的字符串。完成复制之后,再在 str1 的末尾添加一个 '\0' 字符,表示字符串的结束。
所以,这个程序的目标就是将用户输入的两个字符串连接在一起,其中 str2 的前 n 个字符被添加到 str1 的末尾,并正确处理可能存在的中英文混合的情况。
|
|