鱼C论坛

 找回密码
 立即注册
查看: 89|回复: 2

统计字符数问题

[复制链接]
发表于 2024-7-26 11:07:30 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>

#define MAX 1024

int main()
{
        char str[MAX];
        char *target=str;
        int count=0;
       
        printf("请输入一个字符串:");
        fgets(str,MAX,stdin);
       
        while(*target++!='\0')
        {
               
                count++;
        }
       
        printf("%d\n",count);
        return 0;
}
为啥统计数比字符数多一个?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-26 15:55:32 | 显示全部楼层
#include<stdio.h>

#define MAX 1024

int main()
{
        unsigned char str[MAX]            ;
        int m                             ;
        printf("请输入一个字符串 : ")     ;
        fgets((char *) str , MAX , stdin) ;
        for(m = 0 ; str[m] ; m ++) {
                if(m) printf(" ")         ;
                printf("%02x" , str[m])   ;
        }
        printf("\n")                      ;
        printf("count = %d\n" , m)        ;
}
        编译、运行实况:
D:\[exercise]\C>g++ -o x x.c

D:\[exercise]\C>x
请输入一个字符串 : I Love fishC
49 20 4c 6f 76 65 20 66 69 73 68 43 0a
count = 13

D:\[exercise]\C>
        这个代码与楼主的代码功能基本一样,不同之处是在输出统计结果之前,添加了打印输出所键入每一个字符的十六进制 ASCII 编码的功能。
        运行这个代码可以发现,每次的统计字符数确实比键入字符数量多出1个,可是,每次的最后一个字符的 ASCII 编码值一定是 0x0a,没错,是回车字符 '\n' 的 ASCII 编码,于是,可以得出结论,通过 fget() 从键盘获取到的字符串一定会比实际输入多出一个 '\n' 字符,这个字符一定位于字符串的末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 13:08:57 | 显示全部楼层
这段代码统计字符串长度时出现比实际字符数多一个的情况,是因为fgets()函数在读取字符串时会将换行符\n也一并读入到字符数组中。当你输入完字符串按下回车键时,换行符就被当作字符串的一部分存储在数组里了。
在循环中,你通过检测字符是否为\0来判断字符串的结束,但在计算字符个数时也将这个换行符计算进去了。因此,统计的结果会比实际看到的字符数多一个。
如果你想要准确统计用户输入的可见字符数,可以在循环条件中额外检查是否遇到了换行符,从而在遇到\n时停止计数。但在这个特定的代码片段中,统计包括换行符在内的总字节数也是合理的做法,只需了解这一点即可。

如果你希望统计时不包括换行符\n,可以稍微调整你的代码如下:
#include<stdio.h>

#define MAX 1024

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

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

    while(*target != '\0')
    {
        if(*target != '\n') // 添加条件,跳过换行符
            count++;
        target++; // 移动指针到下一个字符
    }

    printf("%d\n",count);
    return 0;
}

在这个修改后的版本中,我在循环体内增加了一个条件if(*target != '\n')来检查当前字符是否为换行符。如果是换行符,则不计入字符数,这样统计的就是不包括换行符的实际字符数量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-8 09:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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