带你学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: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个字节部分,你再往后移两位,就又移了两字节,这样就少检测了) 肯定是代码错了() 你要把中文字符当作一个字符还是两个 感谢!!!!刚刚看到还思来想去,搞不懂,后来发现哪怪怪的,才明白我把char类型所占字节记错了(不知道哪学的char占一个字节) 福晓锐 发表于 2023-1-11 14:37
感谢!!!!刚刚看到还思来想去,搞不懂,后来发现哪怪怪的,才明白我把char类型所占字节记错了(不知道哪学的 ...
嗯。。。
好像char确实占1个字节啊?{:10_277:} 额外减小 发表于 2023-1-11 14:39
嗯。。。
好像char确实占1个字节啊?
啊???????可是我看百度不是说俩字节吗 本帖最后由 额外减小 于 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 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]