鱼C论坛

 找回密码
 立即注册
查看: 1260|回复: 3

[已解决]求助 关于指针

[复制链接]
发表于 2020-3-6 20:31:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAX 128

  4. int main()
  5. {
  6.         char str1[MAX];
  7.         char str2[MAX];
  8.         char *p1, *p2;
  9.         int num1,num2;

  10.         printf("请输入第一个字符串:");
  11.         fgets(str1,MAX,stdin);

  12.         printf("请输入第二个字符串:");
  13.         fgets(str2,MAX,stdin);

  14.         p1 = str1;
  15.         p2 = str2;

  16.         num1 = strlen(p2);
  17.         num2 = strlen(p1);

  18. //        p1 = p1 + num2;

  19.         strncat(str1,str2,num2);


  20.         printf("%s\n",p1);

  21.         return 0;

  22. }
复制代码


最后无法将两个输入的字符串连接起来,会有一个换行符号,这个应该怎么解决

这是输出的结果
请输入第一个字符串:www.
请输入第二个字符串:fishc
www.
fishc
最佳答案
2020-3-6 21:21:58
本帖最后由 major_lyu 于 2020-3-6 21:24 编辑

fgets在读入字符串时不会忽略回车符。所以你用fgets读入的str1和str2末尾都是有一个回车的。
实际上你这个拼接已经完成了。
你想去掉str1后面的的回车的话,可以在拼接前强制将最后一个回车符换成‘'\0';
在strncat()那一句之前加上。
*(p1+num2-1) = '\0';

或者用scanf("%s“)读入字符串,这样会自动忽略末尾的回车。


另外,你这strncat第三个参数似乎不对吧,应该是需要拷贝到目标字符串的长度,要将第二个字符串全部续借到第一个字符串,第三个参数应该是第二个字符串的长度。

你这num1是第二个字符串的长度,num2是第一个字符串的长度。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 21:21:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 major_lyu 于 2020-3-6 21:24 编辑

fgets在读入字符串时不会忽略回车符。所以你用fgets读入的str1和str2末尾都是有一个回车的。
实际上你这个拼接已经完成了。
你想去掉str1后面的的回车的话,可以在拼接前强制将最后一个回车符换成‘'\0';
在strncat()那一句之前加上。
*(p1+num2-1) = '\0';

或者用scanf("%s“)读入字符串,这样会自动忽略末尾的回车。


另外,你这strncat第三个参数似乎不对吧,应该是需要拷贝到目标字符串的长度,要将第二个字符串全部续借到第一个字符串,第三个参数应该是第二个字符串的长度。

你这num1是第二个字符串的长度,num2是第一个字符串的长度。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:38:53 | 显示全部楼层
fgets 函数最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符 '\0'。当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n' 会被作为一个合法的字符读取)
所以输出的时候会分行。
我上传的这段代码也有缺陷,测试了好长时间,要想输出完整的连接后的句子需要在第一个句子后面后面追加空格。
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define MAX 128

  4. int main()
  5. {
  6.     char str1[MAX];
  7.     char str2[MAX];
  8.     char *p1, *p2;
  9.     int num1,num2;

  10.     printf("请输入第一个字符串:");
  11.     fgets(str1,MAX,stdin);
  12.    

  13.     printf("请输入第二个字符串:");
  14.     fgets(str2,MAX,stdin);

  15.     p1 = str1;
  16.     p2 = str2;       

  17.     num1 = strlen(p1);
  18.     num2 = strlen(p2);

  19.        
  20.         str1[num1-1]='\b';
  21.     strncat(str1,str2,num2);


  22.     printf("%s\n",str1);

  23.     return 0;

  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 22:06:33 | 显示全部楼层
百度来的一些资料:fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。然后fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。
问题出在有时字符串的结尾处可能多出一个换行符,我们需要把它去掉。

                               
登录/注册后可看大图

查看汇编代码也会发现多了一个0xA,这个对应的ascii码就是换行符,所以要去掉
我的解法直接用指针处理下得了
  1. int main()
  2. {
  3.         char str1[MAX];
  4.         char str2[MAX];
  5.         char *p1, *p2;
  6.         int num1, num2,i;

  7.         printf("请输入第一个字符串:");
  8.         fgets(str1, MAX, stdin);

  9.         printf("请输入第二个字符串:");
  10.         fgets(str2, MAX, stdin);

  11.         p1 = str1;
  12.         p2 = str2;
  13.         num1 = strlen(p1);
  14.         num2 = strlen(p2);
  15.         /*
  16.         num1 = strlen(p2);
  17.         num2 = strlen(p1);

  18.         //        p1 = p1 + num2;

  19.         strncat(str1, str2, num2);
  20.        
  21.         */
  22.        
  23.         for ( i = 0; i < num2-1; i++) {
  24.                 *(p1 + num1 - 1 + i) = *(p2 + i);
  25.                 printf("%c\n", *(p2 + i));

  26.         }
  27.         *(p1 + num1 - 1 + i) = '\0';

  28.         printf("%s\n", p1);

  29.         return 0;

  30. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 12:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表