gzq44 发表于 2020-9-29 14:54:59

S1E22中的length - 1关于scanf和fgets的讨论

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

#include <stdio.h>

#define MAX 1024

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

      printf("请输入一个字符串:");
      scanf("%s", str);

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

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

      return 0;
}
两段代码中只有fgets和scanf交换了一下是用相同的字符输出前者正确而后者少一,这是为什么?
如果可以能帮忙说明下scanf和fgats的区别吗?
{:10_254:}

gzq44 发表于 2020-9-29 15:04:47

有点粗心第一个问题已经搞懂
( fgets 函数会把换行符('\n')也一并读取进去,但我们并不希望把它也计算进去)
求答第二个{:10_266:}

风过无痕1989 发表于 2020-9-29 15:06:27

1.scanf()
所在头文件:stdio.h
语法:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf(“%s”,字符数组名或指针);
2.gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
输出可以考虑puts()函数的应用输出完后会自动加一个回车换行符号

char* gets(char* buffer)
返回值
读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

两者在接受字符串的不同点:
scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中。

乐乐学编程 发表于 2020-9-29 16:00:24

length - 1 是因为 length++ 在 while 循环里面,在检测到最后一个字符后,它又自加了一次
页: [1]
查看完整版本: S1E22中的length - 1关于scanf和fgets的讨论