KAaha 发表于 2020-3-6 15:20:16

c语言数组课后作业求助

#include <stdio.h>

#define MAX 1024

int main()
{
      char str;
      char *target = str;
      int length = 0;

      printf("请输入一个字符串:");
      fgets(str, MAX, stdin);

      while (*target++ != '\0')
      {
                length++;
      }

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

      return 0;
}
为什么最后length要-1

jzzc 发表于 2020-3-6 15:26:42

哈哈,这个问题其实很简单的,fgets会在读到回车时自动结束并在后面加一个'\0',但是在这之前回车也被读取进去了呦,
也就是说运行完fgets()函数后,你的str内是这样的"(你输入的字符)'\n' '\0' "{:10_254:}

jzzc 发表于 2020-3-6 15:35:50

jzzc 发表于 2020-3-6 15:26
哈哈,这个问题其实很简单的,fgets会在读到回车时自动结束并在后面加一个'\0',但是在这之前回车也被读取 ...

还有不懂的欢迎追问哦{:10_297:}

4goodworld 发表于 2020-3-6 15:39:14

百度来的一些资料:fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。然后fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。
问题出在有时字符串的结尾处可能多出一个换行符,我们需要把它去掉。

查看汇编代码也会发现多了一个0xA,这个对应的ascii码就是换行符,所以要去掉

KAaha 发表于 2020-3-6 15:39:34

jzzc 发表于 2020-3-6 15:26
哈哈,这个问题其实很简单的,fgets会在读到回车时自动结束并在后面加一个'\0',但是在这之前回车也被读取 ...

好的我懂啦 非常感谢{:10_275:}

jzzc 发表于 2020-3-6 15:40:40

KAaha 发表于 2020-3-6 15:39
好的我懂啦 非常感谢

{:10_298:}

KAaha 发表于 2020-3-6 15:41:44

4goodworld 发表于 2020-3-6 15:39
百度来的一些资料:fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的 ...

好的好的我已经懂啦 蟹蟹大神们
页: [1]
查看完整版本: c语言数组课后作业求助