|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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工作室!
问题出在修改后代码的 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 将不会递增,从而得到正确的字符数。
如果问题已经解决,请设置最佳答案
|
|