cs宇帝 发表于 2023-11-16 21:10:05

c

请问target=target+2;上面已经target++了,假如第一个字符是汉字,target++;完了之后target是1再加2,指针不是指向3了吗
#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;
}

isdkz 发表于 2023-11-16 21:10:11

问题出在target+=2这一行。当汉字在字符串中时,target指针会向后移动3个字节,而不是2个字节。这是因为在UTF-8编码中,一个汉字通常会占用3个字节的存储空间。因此,应该将target+=3改为target+=3。

修正后的代码如下:

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

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

    return 0;
}


这样就能正确地统计输入的字符数量了。

Mike_python小 发表于 2023-11-16 21:10:58

根据你的代码,如果第一个字符是一个多字节字符(比如汉字),那么在 target++ 操作之后,指针 target 就会指向该多字节字符的下一个字节,而不是下一个字符的开头。因此,在这种情况下,执行 target += 2 时,实际上会跳过两个字节,而不是一个字符的长度。

所以,你的理解是正确的,假设第一个字符是一个汉字,target++ 之后,target 将指向多字节字符的下一个字节,然后执行 target += 2 将指针移动两个字节,导致指针不会指向下一个字符的开头,而是在字符串中跳过了一个位置。

这可能会导致统计字符数目出现错误。为了解决这个问题,你可以使用专门用于处理多字节字符的函数来确保正确的字符计数,或者修改算法来正确处理多字节字符。
页: [1]
查看完整版本: c