鱼C论坛

 找回密码
 立即注册
查看: 2449|回复: 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 编辑

这是将中文字符当作一个字符 ↓
#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 ++;
                }
            length++;
        }

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

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

这是将中文字符当作两个字符(ANSI)↓
#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;
            }
            length++;
        }

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

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

其实问题出在原本24行的target+=2
你如果检测到汉字(此时target已经移到汉字的第2个字节部分,你再往后移两位,就又移了两字节,这样就少检测了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这是将中文字符当作一个字符 ↓
#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 ++;
                }
            length++;
        }

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

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

这是将中文字符当作两个字符(ANSI)↓
#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;
            }
            length++;
        }

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

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

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

使用道具 举报

发表于 2023-1-9 16:19:55 | 显示全部楼层
肯定是代码错了()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 16:20:33 | 显示全部楼层
你要把中文字符当作一个字符还是两个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

嗯。。。
好像char确实占1个字节啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

啊???????可是我看百度不是说俩字节吗
想知道小甲鱼最近在做啥?请访问 -> 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()的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 17:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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