白小轩 发表于 2024-7-26 11:07:30

统计字符数问题

#include<stdio.h>

#define MAX 1024

int main()
{
        char str;
        char *target=str;
        int count=0;
       
        printf("请输入一个字符串:");
        fgets(str,MAX,stdin);
       
        while(*target++!='\0')
        {
               
                count++;
        }
       
        printf("%d\n",count);
        return 0;
}
为啥统计数比字符数多一个?

jackz007 发表于 2024-7-26 15:55:32

#include<stdio.h>

#define MAX 1024

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

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

D:\\C>
      这个代码与楼主的代码功能基本一样,不同之处是在输出统计结果之前,添加了打印输出所键入每一个字符的十六进制 ASCII 编码的功能。
      运行这个代码可以发现,每次的统计字符数确实比键入字符数量多出1个,可是,每次的最后一个字符的 ASCII 编码值一定是 0x0a,没错,是回车字符 '\n' 的 ASCII 编码,于是,可以得出结论,通过 fget() 从键盘获取到的字符串一定会比实际输入多出一个 '\n' 字符,这个字符一定位于字符串的末尾。

行客 发表于 2024-8-1 13:08:57

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

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

#define MAX 1024

int main()
{
    char str;
    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')来检查当前字符是否为换行符。如果是换行符,则不计入字符数,这样统计的就是不包括换行符的实际字符数量。
页: [1]
查看完整版本: 统计字符数问题