鱼C论坛

 找回密码
 立即注册
查看: 1627|回复: 10

[已解决]答案错误

[复制链接]
发表于 2019-12-22 09:49:02 | 显示全部楼层 |阅读模式

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

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

x
代码是进阶的答案,
  1. [code]#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 += 2;
  21.                 }
  22.                 length++;
  23.         }

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

  25.         return 0;
  26. }
复制代码
[/code]
最佳答案
2019-12-22 12:18:58
本帖最后由 jackz007 于 2019-12-22 12:40 编辑

        两个问题:
       1、通过 fgets() 获取的字符串最后那个字符一定是换行符 '\n',而这个换行符显然并非我们所预期,所以,应该检测换行符,而不是 '\0';

       2、if(ch < 0) 时,target ++ 就够了,target += 2 就过了。
  1.                 ch = * target++ ; // 这里 target 加过了
  2. . . . . . .
  3.                 if ((int)ch < 0)
  4.                 {
  5.                         target += 2 ; // 这里 target 应该 + 1,+ 2 就错了。
复制代码

        下面是我修改的版本,供楼主参考
  1. #include <stdio.h>

  2. #define MAX 1024

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

  8.         printf("请输入一个字符串:")                                                                          ;
  9.         fgets(str , MAX , stdin)                                                                              ;
  10.         for(length = 0 ; length < MAX && * target != '\n' ; length ++ , target ++) if(* target < 0) target ++ ;
  11.         * target = '\0'                                                                                       ;
  12.         printf("您总共输入了 %d 个字符!\n", length)                                                          ;
  13. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 请输入一个字符串:TDM GCC32 5.1.0 开发环境设置完毕
  4. 您总共输入了 24 个字符!

  5. C:\Bin>
复制代码

这是我的运行结果

这是我的运行结果
问你.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-22 12:18:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-12-22 12:40 编辑

        两个问题:
       1、通过 fgets() 获取的字符串最后那个字符一定是换行符 '\n',而这个换行符显然并非我们所预期,所以,应该检测换行符,而不是 '\0';

       2、if(ch < 0) 时,target ++ 就够了,target += 2 就过了。
  1.                 ch = * target++ ; // 这里 target 加过了
  2. . . . . . .
  3.                 if ((int)ch < 0)
  4.                 {
  5.                         target += 2 ; // 这里 target 应该 + 1,+ 2 就错了。
复制代码

        下面是我修改的版本,供楼主参考
  1. #include <stdio.h>

  2. #define MAX 1024

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

  8.         printf("请输入一个字符串:")                                                                          ;
  9.         fgets(str , MAX , stdin)                                                                              ;
  10.         for(length = 0 ; length < MAX && * target != '\n' ; length ++ , target ++) if(* target < 0) target ++ ;
  11.         * target = '\0'                                                                                       ;
  12.         printf("您总共输入了 %d 个字符!\n", length)                                                          ;
  13. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 请输入一个字符串:TDM GCC32 5.1.0 开发环境设置完毕
  4. 您总共输入了 24 个字符!

  5. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 12:20:21 | 显示全部楼层
  1. #include <stdio.h>
  2. #define MAX 1024

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

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

  10.         while (1)
  11.         {
  12.                 if (*target == '\0')
  13.                 {
  14.                         break;
  15.                 }
  16.                 if ((int)*target < 0)
  17.                 {
  18.                         target += 2;
  19.                 }
  20.                 else
  21.                 {
  22.                         target++;
  23.                 }
  24.                 length++;
  25.         }

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

  27.         return 0;
  28. }
复制代码
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 13:58:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 14:03:39 | 显示全部楼层
jackz007 发表于 2019-12-22 12:18
两个问题:
       1、通过 fgets() 获取的字符串最后那个字符一定是换行符 '\n',而这个换行符显 ...

老哥,你这个写的好是好,但对于新手。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 14:06:09 | 显示全部楼层
jackz007 发表于 2019-12-22 12:18
两个问题:
       1、通过 fgets() 获取的字符串最后那个字符一定是换行符 '\n',而这个换行符显 ...

是不是因为是中文,所有是target += 2 ,一个中文不是占2个字节吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 14:10:42 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-22 14:11 编辑
最后的魁拔 发表于 2019-12-22 14:03
老哥,你这个写的好是好,但对于新手。。。。。


     这个逻辑还不简单?从字符串开头到末尾的 '\n' 字符循环枚举,每次循环字符计数加 1,字符串指针加 1,遇到中文字符则字符串指针再加 1(Windows 平台,如果是 Linux 平台,字符串指针的确应该加 2)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 14:11:55 | 显示全部楼层
jackz007 发表于 2019-12-22 14:10
这个逻辑还不简单?从字符串开头到末尾的 '\n' 字符循环,每次循环字符计数加 1,字符串指针加 1, ...

好吧。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 14:21:47 | 显示全部楼层
jackz007 发表于 2019-12-22 14:10
这个逻辑还不简单?从字符串开头到末尾的 '\n' 字符循环枚举,每次循环字符计数加 1,字符串指针 ...

老哥,循环的时候,你那个字符串指针加一,如果遇到中文,字符串指针再加一,是不是就是相当于,中文的字符串指针加2了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 14:37:02 | 显示全部楼层
最后的魁拔 发表于 2019-12-22 14:21
老哥,循环的时候,你那个字符串指针加一,如果遇到中文,字符串指针再加一,是不是就是相当于,中文的字 ...

      是的,Windows 系统中文字符采用 GBK 编码,每个汉字占用 2 个字节,Linux 系统中文字符采用 UTF-8 编码,每个汉字占用的是 3 个字节。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 14:39:30 | 显示全部楼层
jackz007 发表于 2019-12-22 14:37
是的,Windows 系统中文字符采用 GBK 编码,每个汉字占用 2 个字节,Linux 系统中文字符采用 UTF-8 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 23:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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