|  | 
 
| 
基础要求:使用 fgets 函数接收用户输入的两个字符串到 str1 和 str2 中,将 str2 连接到 str1 后边,并打印出来。
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  进阶要求:实现 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  的末尾,并正确处理可能存在的中英文混合的情况。
 | 
 |