鱼C论坛

 找回密码
 立即注册
查看: 685|回复: 10

[已解决]问题是这样写跑不出结果 如图片所示 不知道为什么 求大佬指点迷津

[复制链接]
发表于 2023-7-4 22:45:39 | 显示全部楼层 |阅读模式

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

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

x
题目如下:1. 拷贝字符串 —— strcpy 和 strncpy 函数
基础要求:
使用 fgets 函数读取用户输入的字符串(英文)并存储到字符数组 str1 中,并利用指针,将 str1 中的字符串拷贝到字符数组 str2 中

问题是这样写跑不出结果 如图片所示 不知道为什么 求大佬指点迷津

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main() {
  4.         char str1[MAX];
  5.         char str2[MAX];//用于存储从str1复制过来的数据
  6.         char *st1 = str1, *st2 = str2;


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


  9.         printf("现在开始拷贝---------\n");
  10.         printf("----拷贝完成-----\n");
  11.         printf("----现在str2的内容是:-----\n");

  12.         while ((*st2++ = *st1++) != '\0');
  13.         printf("%s", st2);

  14.         return 0;
  15. }
复制代码
最佳答案
2023-7-4 22:49:15
根据您提供的代码,问题可能出在最后输出 `st2` 的内容时。在拷贝字符串结束后,指针 `st2` 已经指向了字符串末尾的空字符 '\0',因此直接输出 `st2` 将不会输出任何内容。

为了正确输出 `str2` 中的内容,您可以使用指针 `st2` 指向 `str2` 的开头,然后进行输出。

以下是已经修正的代码:

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main() {
  4.     char str1[MAX];
  5.     char str2[MAX];  // 用于存储从str1复制过来的数据
  6.     char *st1 = str1, *st2 = str2;

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

  9.     printf("现在开始拷贝---------\n");

  10.     while ((*st2++ = *st1++) != '\0')
  11.         ;

  12.     printf("----拷贝完成-----\n");
  13.     printf("----现在str2的内容是:%s-----\n", str2);

  14.     return 0;
  15. }
复制代码


求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-4 22:49:15 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码,问题可能出在最后输出 `st2` 的内容时。在拷贝字符串结束后,指针 `st2` 已经指向了字符串末尾的空字符 '\0',因此直接输出 `st2` 将不会输出任何内容。

为了正确输出 `str2` 中的内容,您可以使用指针 `st2` 指向 `str2` 的开头,然后进行输出。

以下是已经修正的代码:

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main() {
  4.     char str1[MAX];
  5.     char str2[MAX];  // 用于存储从str1复制过来的数据
  6.     char *st1 = str1, *st2 = str2;

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

  9.     printf("现在开始拷贝---------\n");

  10.     while ((*st2++ = *st1++) != '\0')
  11.         ;

  12.     printf("----拷贝完成-----\n");
  13.     printf("----现在str2的内容是:%s-----\n", str2);

  14.     return 0;
  15. }
复制代码


求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-4 22:55:39 | 显示全部楼层
sfqxx 发表于 2023-7-4 22:49
根据您提供的代码,问题可能出在最后输出 `st2` 的内容时。在拷贝字符串结束后,指针 `st2` 已经指向了字符 ...

哈喽
大佬你好 我想问一下我的那个代码和您改后的代码看着没有差别为什么您的代码能跑出答案呢,emmm 就是下面这句话 我没从您改后的代码中看出来,可能是我学问不到家,望大佬再指点一下,跪谢
您可以使用指针 `st2` 指向 `str2` 的开头,然后进行输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 22:55:56 | 显示全部楼层
ED_smile 发表于 2023-7-4 22:55
哈喽
大佬你好 我想问一下我的那个代码和您改后的代码看着没有差别为什么您的代码能跑出答案呢,emmm 就 ...

非常抱歉给您带来困惑。实际上,我在之前的回答中所提到的代码修改只是为了修复最后输出 `str2` 的问题,并没有对拷贝过程进行任何修改。

原始代码中的拷贝过程是利用指针 `st1` 和 `st2` 进行字符逐个拷贝的操作:`*st2++ = *st1++`。这行代码等价于先将 `st1` 指向的字符拷贝给 `st2`,然后移动指针 `st1` 和 `st2` 到下一个字符位置。

即使在原始代码中没有显式输出 `str2` 的部分,拷贝的操作仍然已经完成了,`str2` 中存储了从 `str1` 复制过来的字符串。在原始代码中,`st2` 指向的位置是字符串末尾的空字符 '\0',所以直接输出 `st2` 不会有任何内容显示。

为了正确输出 `str2` 的内容,我在我的回答中建议将指针 `st2` 重新指向 `str2` 的开头,然后进行输出。这样做是为了确保从字符串的开头开始输出,而不是从指向末尾的空字符开始输出。

因此,我的建议只是为了确保输出的正确性,并没有对拷贝过程进行任何修改。感谢您的提醒,如果我之前的解答有任何误导之处,我再次表示歉意。如果您还有其他问题,请随时告诉我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 22:56:57 | 显示全部楼层
指针 `st2` 已经指向了字符串末尾的空字符 '\0',因此直接输出 `st2` 将不会输出任何内容。
注意看看这句话
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 23:01:08 | 显示全部楼层
你的代码主要有两个问题。

1. 你在复制字符串之后再打印字符串。实际上,你应该在复制字符串之前就开始打印。

2. 你的打印方式有问题。当你使用 while 循环完成字符串复制后,st2 指针已经移动到了字符串的末尾,这时直接打印st2是无法得到正确结果的,因为它已经不再指向字符串的起始位置了。

以下是修改后的代码:

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main() {
  4.         char str1[MAX];
  5.         char str2[MAX];//用于存储从str1复制过来的数据
  6.         char *st1 = str1, *st2 = str2;


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


  9.         printf("现在开始拷贝---------\n");

  10.         while ((*st2++ = *st1++) != '\0');
  11.         st2 = str2; //将st2重新指向字符串起始位置

  12.         printf("----拷贝完成-----\n");
  13.         printf("----现在str2的内容是:-----\n");
  14.         printf("%s", st2);

  15.         return 0;
  16. }
复制代码

希望这个答案能帮到你,如果还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 23:02:21 | 显示全部楼层
isdkz 发表于 2023-7-4 23:01
你的代码主要有两个问题。

1. 你在复制字符串之后再打印字符串。实际上,你应该在复制字符串之前就开始 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-4 23:19:05 | 显示全部楼层
sfqxx 发表于 2023-7-4 22:56
指针 `st2` 已经指向了字符串末尾的空字符 '\0',因此直接输出 `st2` 将不会输出任何内容。
注意看看这句 ...

这个问题已经解决 非常感谢大佬 但我还有个小小的疑问 就是在之前思考这个问题的时候,我有尝试过将st2恢复到开头位置,具体做法是 设置了一个int类型的lenth变量放在了while循环里,循环结束后,再将st2 -= length,我认为这样就已经将指针st2 重新指向了 str2 的开头了 但当时报出的结果却是少了第一个字符,我感觉是没有指向开头,而是指向了第二位,之后我试着将st2 -= length -1,我认为这样能将指针再往前移一个字符,但程序跑出来的却是第二个字符也消失了,我又试着将表达式改为 st2 -= length + 1,这次程序直接不出结果了。我不是很懂,但由于之前没有存代码,所以只能口述了,望大佬见谅
另外,就是现在这份代码 我将上面的三个表达式都尝试了一遍,意外发现都能运行出正确的答案,这更加让我疑惑倍增,望大佬能在百忙之中再指点一下 万分感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-4 23:22:23 | 显示全部楼层

对不起,对不起,第一次发帖子,之后再和2楼大佬讨论问题,忘记设置已解决了,真的对不起,浪费了你的时间,我深感抱歉,对不起对不起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 23:24:16 From FishC Mobile | 显示全部楼层
ED_smile 发表于 2023-7-4 23:22
对不起,对不起,第一次发帖子,之后再和2楼大佬讨论问题,忘记设置已解决了,真的对不起,浪费了你的时 ...

没关系,我先睡觉了,明天再回答您的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 23:25:32 | 显示全部楼层
GPT大军令人作呕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 13:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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