zjohannes 发表于 2021-9-8 16:37:12

有关于S1E22课后问题求助

各位大佬好,本次想咨询的是《带你学C带你飞》中S1E22里“动动手”第0题的进阶版,代码根据老师答案如下:

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

但在cmd及线上的编程工具中呈现出两种不同的答案:
1.菜鸟工具运行结果
请输入一个字符串:鱼C工作室-FishC.com
您输入的字符串长度为:15

2.cmd运行结果
请输入一个字符串:鱼C工作室-FishC.com
您输入的字符串长度为:13

请问下是什么原因造成CMD中的字符数量读取不正确呢



人造人 发表于 2021-9-8 16:45:20

提问题的时候 不要这样 《带你学C带你飞》中S1E22里“动动手”第0题的进阶版
你直接复制一遍题目贴出来会更好,更方便别人回答你的问题


估计是编码问题,编码不一样
在两个地方运行这个程序,看看输出有什么不一样
#include <stdio.h>

int main(void)
{
    char str;
    fgets(str, 1024, stdin);
    for(size_t i = 0; str; ++i) printf("%d ", str);
    printf("\n");
    return 0;
}

zjohannes 发表于 2021-9-8 16:55:44

人造人 发表于 2021-9-8 16:45
提问题的时候 不要这样 《带你学C带你飞》中S1E22里“动动手”第0题的进阶版
你直接复制一遍题目贴出来会 ...

{:10_266:}对不起我以后会注意的

在cmd中运行结果如下
-45 -29 67 -71 -92 -41 -9 -54 -46 45 70 105 115 104 67 46 99 111 109 10

在菜鸟工具中运行结果如下
-23 -79 -68 67 -27 -73 -91 -28 -67 -100 -27 -82 -92 45 70 105 115 104 67 46 99 111 109

人造人 发表于 2021-9-8 17:08:31

zjohannes 发表于 2021-9-8 16:55
对不起我以后会注意的

在cmd中运行结果如下


可以看到,第一个是一个中文字符两个字节
第二个是一个中文字符三个字节
这个程序计算的是一个中文三个字节的情况

zjohannes 发表于 2021-9-8 17:24:03

人造人 发表于 2021-9-8 17:08
可以看到,第一个是一个中文字符两个字节
第二个是一个中文字符三个字节
这个程序计算的是一个中文三个 ...

原来如此!请问下大大一般是使用什么编码进行编译呢,这样能预防下次出现这种问题!

人造人 发表于 2021-9-8 17:59:19

zjohannes 发表于 2021-9-8 17:24
原来如此!请问下大大一般是使用什么编码进行编译呢,这样能预防下次出现这种问题!

用 utf-8,utf-8 是一个中文字符三个字节

zjohannes 发表于 2021-9-8 18:04:55

人造人 发表于 2021-9-8 17:59
用 utf-8,utf-8 是一个中文字符三个字节

感谢大大!
页: [1]
查看完整版本: 有关于S1E22课后问题求助