鱼C论坛

 找回密码
 立即注册
查看: 1431|回复: 13

[已解决]这个程序是不是有bug啊,看了一个下午没看懂什么意思,求助各位大佬

[复制链接]
发表于 2020-2-26 17:01:39 | 显示全部楼层 |阅读模式

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

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

x
我一开始以为这个程序是个只计算字符串里非中文个数的,后来发现是连着中文一起计算的,但是参考上机测试那个图,第一次明明3个字,第二次两个字3个英文,然后却输出3个字符,代码没有任何修改,在小甲鱼c教程课后作业22那里的。
最佳答案
2020-2-27 09:48:57
在小甲鱼的编译器上一个中文字符占3个字节,而在Dev C++中一个汉字占两个字节,所以这时候就不能把指针往后移动两位了,只往后移动一位即可。
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         char ch;
  8.         int length = 0;

  9.         printf("请输入一个字符串:");
  10.         fgets(str, MAX, stdin);
  11.         while (1)
  12.         {
  13.                 ch = *target++;
  14.                 if (ch == '\0')
  15.                 {
  16.                         break;
  17.                 }
  18.                 if ((int)ch < 0)
  19.                 {
  20.                         target += 1;//指针向后移动一位。
  21.                 }
  22.                 length++;
  23.         }

  24.         printf("您总共输入了 %d 个字符!\n", length - 1);

  25.         return 0;
  26. }

复制代码

题目

题目

答案

答案

上机测试

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

使用道具 举报

 楼主| 发表于 2020-2-26 22:13:15 | 显示全部楼层
#include <stdio.h>

#define MAX 1024

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

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

        while (1)
        {
                ch = *target++;
                if (ch == '\0')
                {
                        break;
                }
                if ((int)ch < 0)
                {
                        target += 2;
                }
                length++;
        }

        printf("您总共输入了 %d 个字符!\n", length - 1);

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

使用道具 举报

发表于 2020-2-26 17:07:13 | 显示全部楼层
可以把文本代码发出来吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 17:17:47 | 显示全部楼层
qiuyouzhi 发表于 2020-2-26 17:07
可以把文本代码发出来吗

那个右边的就是把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 17:23:38 | 显示全部楼层
蒋博文 发表于 2020-2-26 17:17
那个右边的就是把

我说的是发到帖子上面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 17:27:38 | 显示全部楼层
qiuyouzhi 发表于 2020-2-26 17:23
我说的是发到帖子上面

emmmm,好吧误解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 17:31:16 | 显示全部楼层
qiuyouzhi 发表于 2020-2-26 17:23
我说的是发到帖子上面

emmmmm,我上机试了一下它发的代码,错误好多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 17:40:26 | 显示全部楼层
编译器不一样吧,你这个是windows环境下,小甲鱼是linux环境
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-26 19:13:53 | 显示全部楼层
chxchxkkk 发表于 2020-2-26 17:40
编译器不一样吧,你这个是windows环境下,小甲鱼是linux环境

但是都是c语言啊,小甲鱼在课程上的代码我都能运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-26 22:12:16 | 显示全部楼层
qiuyouzhi 发表于 2020-2-26 17:07
可以把文本代码发出来吗

#include <stdio.h>

#define MAX 1024

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

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

        while (1)
        {
                ch = *target++;
                if (ch == '\0')
                {
                        break;
                }
                if ((int)ch < 0)
                {
                        target += 2;
                }
                length++;
        }

        printf("您总共输入了 %d 个字符!\n", length - 1);

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

使用道具 举报

 楼主| 发表于 2020-2-26 22:16:32 | 显示全部楼层
chxchxkkk 发表于 2020-2-26 17:40
编译器不一样吧,你这个是windows环境下,小甲鱼是linux环境

不是,环境不同但语言标准一样,语法都一样的,我用的是ISO c99,和小甲鱼是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 00:02:39 | 显示全部楼层
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         char ch;
  8.         int length = 0;

  9.         printf("请输入一个字符串:\n");
  10.         fgets(str, MAX, stdin);
  11.         printf("%s",str);
  12.         while (1)
  13.         {
  14.                 ch = *target++;
  15.                 if (ch == '\0')
  16.                 {
  17.                         break;
  18.                 }
  19.                 if ((int)ch < 0)
  20.                 {
  21.                         target += 1;//之前操作的时候,target已经target ++了,所以,这边感觉只要加1就行了,不需要加2
  22.                 }
  23.                 length++;
  24.         }

  25.         printf("您总共输入了 %d 个字符!\n", length - 1);

  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 09:48:57 | 显示全部楼层    本楼为最佳答案   
在小甲鱼的编译器上一个中文字符占3个字节,而在Dev C++中一个汉字占两个字节,所以这时候就不能把指针往后移动两位了,只往后移动一位即可。
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         char ch;
  8.         int length = 0;

  9.         printf("请输入一个字符串:");
  10.         fgets(str, MAX, stdin);
  11.         while (1)
  12.         {
  13.                 ch = *target++;
  14.                 if (ch == '\0')
  15.                 {
  16.                         break;
  17.                 }
  18.                 if ((int)ch < 0)
  19.                 {
  20.                         target += 1;//指针向后移动一位。
  21.                 }
  22.                 length++;
  23.         }

  24.         printf("您总共输入了 %d 个字符!\n", length - 1);

  25.         return 0;
  26. }

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

使用道具 举报

发表于 2020-3-2 17:08:02 | 显示全部楼层
66666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 20:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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