鱼C论坛

 找回密码
 立即注册
查看: 2147|回复: 26

[已解决]【鱼币已派完】C语言求助

[复制链接]
发表于 2023-10-3 16:59:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 风眠 于 2023-10-3 17:14 编辑

原代码
#include <stdio.h>

#define MAX 1024

int main() {
  char str[MAX];
  int count = 0;
  char *p = str;

  printf("请输入一个字符串:");
  fgets(str, MAX, stdin);

  while (*p++ != '\0') {
    count++;
  }

  printf("您总共输入了%d个字符\n", count);

  return 0;
}
效果
$gcc my_strlen.c -o test&&./test
请输入一个字符串:I love FishC.com!
您总共输入了18个字符
修改后代码
#include <stdio.h>

#define MAX 1024

int main() {
  char str[MAX];
  int count = 0;
  char *p = str;

  printf("请输入一个字符串:");
  fgets(str, MAX, stdin);

  while (*p++ != '\0' && count++)
    ;

  printf("您总共输入了%d个字符\n", count);

  return 0;
}
效果
$ gcc my_strlen.c -o test&&./test
请输入一个字符串:I love FishC.com!
您总共输入了1个字符
这是什么缘故?I love FishC.com!我爱鱼C工作室!
最佳答案
2023-10-3 16:59:34
问题出在修改后代码的 while 循环中。在原始代码中,count 的递增是在循环体内进行的,而在修改后的代码中,count 的递增被移到了循环条件中。这导致了计数不准确的问题。

原始代码的 while 循环:
while (*p++ != '\\0') {
    count++;
}

修改后代码的 while 循环:
while (*p++ != '\\0' && count++)
    ;

在修改后的代码中,count 的递增与 *p++ != '\\0' 的判断是并列关系,这意味着当 *p\\0 时,count 仍然会递增。这就是为什么修改后的代码输出的字符数为 1 的原因。

要修复这个问题,您可以将 count 的递增放回循环体内,如下所示:
#include <stdio.h>
#define MAX 1024

int main() {
    char str[MAX];
    int count = 0;
    char *p = str;

    printf("请输入一个字符串:");
    fgets(str, MAX, stdin);

    while (*p != '\\0') {
        count++;
        p++;
    }

    printf("您总共输入了%d个字符\
", count);
    return 0;
}

这样,当 *p\\0 时,count 将不会递增,从而得到正确的字符数。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-3 16:59:11 | 显示全部楼层
问题出在while循环中的条件语句上。原代码中的while循环条件是*p++ != '\0',即只要指针p所指向的字符不是'\0',就一直循环下去。而修改后的代码中,while循环条件是*p++ != '\0' && count++,即只要指针p所指向的字符不是'\0'并且count自增1,就一直循环下去。这样会导致count在第一个字符判断后就自增1,因此输出的结果为1。应该将while循环条件改为*p++ != '\0' && ++count,先自增count再判断条件,即可得到正确的输出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:59:34 | 显示全部楼层    本楼为最佳答案   
问题出在修改后代码的 while 循环中。在原始代码中,count 的递增是在循环体内进行的,而在修改后的代码中,count 的递增被移到了循环条件中。这导致了计数不准确的问题。

原始代码的 while 循环:
while (*p++ != '\\0') {
    count++;
}

修改后代码的 while 循环:
while (*p++ != '\\0' && count++)
    ;

在修改后的代码中,count 的递增与 *p++ != '\\0' 的判断是并列关系,这意味着当 *p\\0 时,count 仍然会递增。这就是为什么修改后的代码输出的字符数为 1 的原因。

要修复这个问题,您可以将 count 的递增放回循环体内,如下所示:
#include <stdio.h>
#define MAX 1024

int main() {
    char str[MAX];
    int count = 0;
    char *p = str;

    printf("请输入一个字符串:");
    fgets(str, MAX, stdin);

    while (*p != '\\0') {
        count++;
        p++;
    }

    printf("您总共输入了%d个字符\
", count);
    return 0;
}

这样,当 *p\\0 时,count 将不会递增,从而得到正确的字符数。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 17:00:32 | 显示全部楼层
isdkz 发表于 2023-10-3 16:59
问题出在while循环中的条件语句上。原代码中的while循环条件是*p++ != '\0',即只要指针p所指向的字符不是' ...

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

使用道具 举报

 楼主| 发表于 2023-10-3 17:01:16 | 显示全部楼层
count++和++count不是只在赋值时有差异吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:01:30 | 显示全部楼层
两个代码一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:02:04 | 显示全部楼层
风眠 发表于 2023-10-3 17:01
count++和++count不是只在赋值时有差异吗?

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

使用道具 举报

 楼主| 发表于 2023-10-3 17:02:19 | 显示全部楼层
陶远航 发表于 2023-10-3 16:59
问题出在修改后代码的 while 循环中。在原始代码中,count 的递增是在循环体内进行的,而在修改后的代码中 ...

可为什么第一个就是\0呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:04:06 | 显示全部楼层

回帖奖励 +3 鱼币

风眠 发表于 2023-10-3 17:02
可为什么第一个就是\0呢?

抱歉,我之前的解释可能有误。在修改后的代码中,问题实际上出在 `while` 循环条件的逻辑。在原始代码中,`count` 的递增是在循环体内进行的,而在修改后的代码中,`count` 的递增被移到了循环条件中。这导致了计数不准确的问题。

原始代码的 `while` 循环:
while (*p++ != '\0') {
    count++;
}

修改后代码的 `while` 循环:
while (*p++ != '\0' && count++)
    ;

在修改后的代码中,`count++` 与 `*p++ != '\0'` 的判断是并列关系,这意味着当 `*p` 为 `\0` 时,`count` 仍然会递增。这就是为什么修改后的代码输出的字符数为 1 的原因。

要修复这个问题,您可以将 `count` 的递增放回循环体内,如下所示:
#include <stdio.h>
#define MAX 1024

int main() {
    char str[MAX];
    int count = 0;
    char *p = str;

    printf("请输入一个字符串:");
    fgets(str, MAX, stdin);

    while (*p != '\0') {
        count++;
        p++;
    }

    printf("您总共输入了%d个字符\n", count);
    return 0;
}

这样,当 `*p` 为 `\0` 时,`count` 将不会递增,从而得到正确的字符数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 17:04:41 | 显示全部楼层

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

使用道具 举报

发表于 2023-10-3 17:05:08 | 显示全部楼层
风眠 发表于 2023-10-3 17:04
你不就三楼吗?

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

使用道具 举报

 楼主| 发表于 2023-10-3 17:06:40 | 显示全部楼层
陶远航 发表于 2023-10-3 17:04
抱歉,我之前的解释可能有误。在修改后的代码中,问题实际上出在 `while` 循环条件的逻辑。在原始代码中 ...

HEY,兄弟,你是chatgpt3吗?

而且......你的答案不也没区别吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:06:56 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

发表于 2023-10-3 17:07:00 | 显示全部楼层
风眠 发表于 2023-10-3 14:06
HEY,兄弟,你是chatgpt3吗?

而且......你的答案不也没区别吗?

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

使用道具 举报

 楼主| 发表于 2023-10-3 17:07:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:07:32 | 显示全部楼层
风眠 发表于 2023-10-3 17:06
HEY,兄弟,你是chatgpt3吗?

而且......你的答案不也没区别吗?

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

使用道具 举报

 楼主| 发表于 2023-10-3 17:07:54 | 显示全部楼层

这么好运的?!



哦,原来我改了概率
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 17:08:43 | 显示全部楼层

4楼不我吗?楼上才是他啊......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 17:11:14 | 显示全部楼层

额,感觉除了它被做成了自动回复AI和chatgpt3没什么区别,不过好像确实是聪明了一点......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 17:12:04 | 显示全部楼层
风眠 发表于 2023-10-3 17:11
额,感觉除了它被做成了自动回复AI和chatgpt3没什么区别,不过好像确实是聪明了一点......

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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