鱼C论坛

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

[已解决]答案错误

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

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

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

x
代码是进阶的答案,
[code]#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;
}
[/code]
最佳答案
2019-12-22 12:18:58
本帖最后由 jackz007 于 2019-12-22 12:40 编辑

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

       2、if(ch < 0) 时,target ++ 就够了,target += 2 就过了。
                ch = * target++ ; // 这里 target 加过了
. . . . . .
                if ((int)ch < 0)
                {
                        target += 2 ; // 这里 target 应该 + 1,+ 2 就错了。
        下面是我修改的版本,供楼主参考
#include <stdio.h>

#define MAX 1024

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

        printf("请输入一个字符串:")                                                                          ;
        fgets(str , MAX , stdin)                                                                              ;
        for(length = 0 ; length < MAX && * target != '\n' ; length ++ , target ++) if(* target < 0) target ++ ;
        * target = '\0'                                                                                       ;
        printf("您总共输入了 %d 个字符!\n", length)                                                          ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

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

C:\Bin>

这是我的运行结果

这是我的运行结果
问你.PNG
想知道小甲鱼最近在做啥?请访问 -> 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 就过了。
                ch = * target++ ; // 这里 target 加过了
. . . . . .
                if ((int)ch < 0)
                {
                        target += 2 ; // 这里 target 应该 + 1,+ 2 就错了。
        下面是我修改的版本,供楼主参考
#include <stdio.h>

#define MAX 1024

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

        printf("请输入一个字符串:")                                                                          ;
        fgets(str , MAX , stdin)                                                                              ;
        for(length = 0 ; length < MAX && * target != '\n' ; length ++ , target ++) if(* target < 0) target ++ ;
        * target = '\0'                                                                                       ;
        printf("您总共输入了 %d 个字符!\n", length)                                                          ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

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

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

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

使用道具 举报

 楼主| 发表于 2019-12-22 13:58:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

老哥,你这个写的好是好,但对于新手。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是不是因为是中文,所有是target += 2 ,一个中文不是占2个字节吗?
想知道小甲鱼最近在做啥?请访问 -> 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)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

老哥,循环的时候,你那个字符串指针加一,如果遇到中文,字符串指针再加一,是不是就是相当于,中文的字符串指针加2了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

      是的,Windows 系统中文字符采用 GBK 编码,每个汉字占用 2 个字节,Linux 系统中文字符采用 UTF-8 编码,每个汉字占用的是 3 个字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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