鱼C论坛

 找回密码
 立即注册
查看: 2848|回复: 8

[已解决]带你学C带你飞-指针和字符数组作业问题

[复制链接]
发表于 2023-1-9 14:39:19 | 显示全部楼层 |阅读模式

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

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

x
关于小甲鱼发的计算输入的字符长度的代码,运行结果每次不一定是完全正确,尤其是出现中英文混合的时候,结果往往都会少,思来想去就是不知道是什么问题,烦请大佬帮忙解决一下

#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;
}
最佳答案
2023-1-9 16:19:29
本帖最后由 额外减小 于 2023-1-9 16:29 编辑

这是将中文字符当作一个字符 ↓

  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 ++;
  21.                 }
  22.             length++;
  23.         }

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

  25.         return 0;
  26. }
复制代码
  1. 输入:
  2. 啦啦啦123abc
  3. 输出:
  4. 9
复制代码


这是将中文字符当作两个字符(ANSI)↓

  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.             length++;
  19.         }

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

  21.         return 0;
  22. }
复制代码
  1. 输入:
  2. 啦啦啦123abc
  3. 输出:
  4. 12
复制代码


其实问题出在原本24行的target+=2
你如果检测到汉字(此时target已经移到汉字的第2个字节部分,你再往后移两位,就又移了两字节,这样就少检测了)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 16:19:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 额外减小 于 2023-1-9 16:29 编辑

这是将中文字符当作一个字符 ↓

  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 ++;
  21.                 }
  22.             length++;
  23.         }

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

  25.         return 0;
  26. }
复制代码
  1. 输入:
  2. 啦啦啦123abc
  3. 输出:
  4. 9
复制代码


这是将中文字符当作两个字符(ANSI)↓

  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.             length++;
  19.         }

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

  21.         return 0;
  22. }
复制代码
  1. 输入:
  2. 啦啦啦123abc
  3. 输出:
  4. 12
复制代码


其实问题出在原本24行的target+=2
你如果检测到汉字(此时target已经移到汉字的第2个字节部分,你再往后移两位,就又移了两字节,这样就少检测了)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 16:19:55 | 显示全部楼层
肯定是代码错了()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 16:20:33 | 显示全部楼层
你要把中文字符当作一个字符还是两个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-11 14:37:29 | 显示全部楼层
感谢!!!!刚刚看到还思来想去,搞不懂,后来发现哪怪怪的,才明白我把char类型所占字节记错了(不知道哪学的char占一个字节)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-11 14:39:14 | 显示全部楼层
福晓锐 发表于 2023-1-11 14:37
感谢!!!!刚刚看到还思来想去,搞不懂,后来发现哪怪怪的,才明白我把char类型所占字节记错了(不知道哪学的 ...

嗯。。。
好像char确实占1个字节啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-12 09:18:36 | 显示全部楼层
额外减小 发表于 2023-1-11 14:39
嗯。。。
好像char确实占1个字节啊?

啊???????可是我看百度不是说俩字节吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-12 11:33:07 | 显示全部楼层
本帖最后由 额外减小 于 2023-1-12 11:34 编辑
福晓锐 发表于 2023-1-12 09:18
啊???????可是我看百度不是说俩字节吗



好像只有这些是占1字节的↓↓↓ 取值范围.jpg ASCII.png
就是只有ASCII规定的1到127号的字符才是标准的char类型吧。()
然后后来因为有更多要表示的字符,1字节(8bit,总共只能表示256种)不够用了,才变成多字节的。
比如汉字,一开始是ANSI,收录的较少,2字节
后来创建UTF-8,收录更多汉字,变成3字节。
然后还有一些控制台的按键是两字节的。这里跟你整理了一张表。
t.txt (460 Bytes, 下载次数: 0)
就是帮你做出了各种控制台按键调用getch()的返回值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-12 11:40:48 | 显示全部楼层
福晓锐 发表于 2023-1-12 09:18
啊???????可是我看百度不是说俩字节吗
  1. sh-5.1$ cat main.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. int main(void) {
  6.     char *str = malloc(13);                     // 没有错误
  7.     //char *str = malloc(sizeof(char) * 13);    // 没有必要,因为 sizeof(char) == 1
  8.     strcpy(str, "hello world!");
  9.     puts(str);
  10.     free(str);
  11.     return 0;
  12. }
  13. sh-5.1$ gcc -g -Wall -o main main.c
  14. sh-5.1$ ./main
  15. hello world!
  16. sh-5.1$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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