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