最后的魁拔 发表于 2019-12-22 09:49:02

答案错误

代码是进阶的答案,#include <stdio.h>

#define MAX 1024

int main()
{
      char str;
      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;
}

jackz007 发表于 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                                                                                       ;
      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>

Tec 发表于 2019-12-22 12:20:21

#include <stdio.h>
#define MAX 1024

int main()
{
        char str;
        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;
}

最后的魁拔 发表于 2019-12-22 13:58:57

Tec 发表于 2019-12-22 12:20


谢谢

最后的魁拔 发表于 2019-12-22 14:03:39

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

老哥,你这个写的好是好,但对于新手。。。。。

最后的魁拔 发表于 2019-12-22 14:06:09

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

是不是因为是中文,所有是target += 2 ,一个中文不是占2个字节吗?

jackz007 发表于 2019-12-22 14:10:42

本帖最后由 jackz007 于 2019-12-22 14:11 编辑

最后的魁拔 发表于 2019-12-22 14:03
老哥,你这个写的好是好,但对于新手。。。。。

   这个逻辑还不简单?从字符串开头到末尾的 '\n' 字符循环枚举,每次循环字符计数加 1,字符串指针加 1,遇到中文字符则字符串指针再加 1(Windows 平台,如果是 Linux 平台,字符串指针的确应该加 2)。

最后的魁拔 发表于 2019-12-22 14:11:55

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

好吧。谢谢

最后的魁拔 发表于 2019-12-22 14:21:47

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

老哥,循环的时候,你那个字符串指针加一,如果遇到中文,字符串指针再加一,是不是就是相当于,中文的字符串指针加2了

jackz007 发表于 2019-12-22 14:37:02

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

      是的,Windows 系统中文字符采用 GBK 编码,每个汉字占用 2 个字节,Linux 系统中文字符采用 UTF-8 编码,每个汉字占用的是 3 个字节。

最后的魁拔 发表于 2019-12-22 14:39:30

jackz007 发表于 2019-12-22 14:37
是的,Windows 系统中文字符采用 GBK 编码,每个汉字占用 2 个字节,Linux 系统中文字符采用 UTF-8 ...

谢谢
页: [1]
查看完整版本: 答案错误