福晓锐 发表于 2023-1-9 14:39:19

带你学C带你飞-指针和字符数组作业问题

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

#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;
}

额外减小 发表于 2023-1-9 16:19:29

本帖最后由 额外减小 于 2023-1-9 16:29 编辑

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

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

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

      return 0;
}
输入:
啦啦啦123abc
输出:
9

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

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

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

      return 0;
}
输入:
啦啦啦123abc
输出:
12

其实问题出在原本24行的target+=2
你如果检测到汉字(此时target已经移到汉字的第2个字节部分,你再往后移两位,就又移了两字节,这样就少检测了)

额外减小 发表于 2023-1-9 16:19:55

肯定是代码错了()

额外减小 发表于 2023-1-9 16:20:33

你要把中文字符当作一个字符还是两个

福晓锐 发表于 2023-1-11 14:37:29

感谢!!!!刚刚看到还思来想去,搞不懂,后来发现哪怪怪的,才明白我把char类型所占字节记错了(不知道哪学的char占一个字节)

额外减小 发表于 2023-1-11 14:39:14

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

嗯。。。
好像char确实占1个字节啊?{:10_277:}

福晓锐 发表于 2023-1-12 09:18:36

额外减小 发表于 2023-1-11 14:39
嗯。。。
好像char确实占1个字节啊?

啊???????可是我看百度不是说俩字节吗

额外减小 发表于 2023-1-12 11:33:07

本帖最后由 额外减小 于 2023-1-12 11:34 编辑

福晓锐 发表于 2023-1-12 09:18
啊???????可是我看百度不是说俩字节吗


好像只有这些是占1字节的↓↓↓
就是只有ASCII规定的1到127号的字符才是标准的char类型吧。()
然后后来因为有更多要表示的字符,1字节(8bit,总共只能表示256种)不够用了,才变成多字节的。
比如汉字,一开始是ANSI,收录的较少,2字节
后来创建UTF-8,收录更多汉字,变成3字节。
然后还有一些控制台的按键是两字节的。这里跟你整理了一张表。

就是帮你做出了各种控制台按键调用getch()的返回值。

人造人 发表于 2023-1-12 11:40:48

福晓锐 发表于 2023-1-12 09:18
啊???????可是我看百度不是说俩字节吗

sh-5.1$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char *str = malloc(13);                     // 没有错误
    //char *str = malloc(sizeof(char) * 13);    // 没有必要,因为 sizeof(char) == 1
    strcpy(str, "hello world!");
    puts(str);
    free(str);
    return 0;
}
sh-5.1$ gcc -g -Wall -o main main.c
sh-5.1$ ./main
hello world!
sh-5.1$
页: [1]
查看完整版本: 带你学C带你飞-指针和字符数组作业问题