fgets()

作者:追风剑情 发布于:2019-10-20 22:30 分类:C

示例一

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5. #include <stdbool.h>
  6.  
  7. #define STLEN 14
  8.  
  9. //argc: 参数个数 argv[]: 参数数组
  10. int main(int argc, char *argv[])
  11. {
  12. char words[STLEN];
  13. puts("Enter a string, please.");
  14. /*
  15. fgets()函数通过第2个参数限制读入的字符数来解决溢出的问题。
  16. 该函数专门设计用于处理文件输入,所以一般情况下可能不太好用。
  17. fgets()和gets的区别如下:
  18. 1. fgets()函数的第2个参数指明了读入的字符的最大数量。如果该参数的
  19. 值是n,那么fgets()将读入n-1个字符,或者读到遇到第一个换行符为止。
  20. 2. fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不同,
  21. gets()会丢弃换行符。
  22. 3. fgets()函数的第3个参数指明要读入的文件。如果读入从键盘输入的数据,
  23. 则以stdin(标准输入)作为参数,该标识符定义在stdio.h中
  24. */
  25. //fgets()只会读取STLEN-1个字符,或者读到第一个换行符,并在后面追加\0
  26. fgets(words, STLEN, stdin);
  27. printf("Your string twice (puts(), then fputs()):\n");
  28. //puts()在输出时会自动追加换行符\n
  29. puts(words);
  30. /*
  31. fputs()在输出时不会自动追加换行符\n
  32. fputs()函数返回指向char的指针。如果一切进行顺利,该函数
  33. 返回的地址与传入的第1个参数相同。但是,如果函数读到文件
  34. 结尾,它将返回一个特殊的指针:空指针(null pointer)。该
  35. 指针保证不会指向有效数据,所以可以用于标识这种特殊情况。
  36. 在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替
  37. 更常见(如果在读入数据时出现某些错误,该函数也返回NULL)。
  38. */
  39. fputs(words, stdout);
  40. puts("Enter another string, please.");
  41. fgets(words, STLEN, stdin);
  42. printf("Your string twice (puts(), then fputs()):\n");
  43. puts(words);
  44. fputs(words, stdout);
  45. puts("\nDone.");
  46.  
  47. //通常gets()与puts()配对使用
  48. //通常fgets()与fputs()配对使用
  49.  
  50. system("pause");
  51. return 0;
  52. }

运行测试
1111.png

示例二

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5. #include <stdbool.h>
  6.  
  7. #define STLEN 10
  8.  
  9. //argc: 参数个数 argv[]: 参数数组
  10. int main(int argc, char *argv[])
  11. {
  12. char words[STLEN];
  13. puts("Enter strings (empty line to quit): ");
  14. //迭代读取当前行
  15. //在用户按下回车键之前,输入都被储存在临时存储区(即,缓冲区)
  16. //按下回车键时,整行输入才被发送给fgets()
  17. while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
  18. //对于输出,fputs()把字符发送给另一个缓冲区,当发送换行符时,
  19. //缓冲区中的内容被发送至屏幕上。
  20. fputs(words, stdout);
  21. puts("Done.");
  22.  
  23. //处理掉换行符方式
  24. /*
  25. int i = 0;
  26. while (words[i] != '\n')
  27. i++;
  28. words[i] = '\0';
  29. */
  30.  
  31. //丢弃输入行中多余字符
  32. //while (getchar() != '\n')
  33. //continue;
  34.  
  35. system("pause");
  36. return 0;
  37. }

运行测试
1111.png

示例三

  1. //Visual Studio中加上这句才可以使用scanf()
  2. //否则只能使用scanf_s()
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5. #include <stdbool.h>
  6.  
  7. #define STLEN 10
  8.  
  9. //argc: 参数个数 argv[]: 参数数组
  10. int main(int argc, char *argv[])
  11. {
  12. char words[STLEN];
  13. int i;
  14.  
  15. puts("Enter strings (empty line to quit): ");
  16. while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
  17. {
  18. i = 0;
  19. while (words[i] != '\n' && words[i] != '\0')
  20. i++;
  21. if (words[i] == '\n')
  22. words[i] = '\0';
  23. else //如果word[i] == '\0'则执行这部分代码
  24. while (getchar() != '\n')
  25. continue;
  26. puts(words);
  27. }
  28. puts("Done.");
  29.  
  30. system("pause");
  31. return 0;
  32. }

运行测试
1111.png

空字符和空指针

      从概念上看,两者完全不同。空字符('\0')是用于标记C字符串末尾的字符,其对应字符编码是0。由于其他字符的编码不可能是0,所以不可能是字符串的一部分。

      空指针(或NULL)有一个值,该值不会与任何数据的有效地址对应。通常,函数使用它返回一个有效地址表示某些特殊情况发生,例如遇到文件结尾或未能按预期执行。

      空字符是整数类型,而空指针是指针类型。两者有时容易混淆的原因是:它们都可以用数值0来表示。但是,从概念上看,两者是不同类型的0。另外,空字符是一个字符,占1字节;而空指针是一个地址,通常占4字节。

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号