示例一
//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define STLEN 14
//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
char words[STLEN];
puts("Enter a string, please.");
/*
fgets()函数通过第2个参数限制读入的字符数来解决溢出的问题。
该函数专门设计用于处理文件输入,所以一般情况下可能不太好用。
fgets()和gets的区别如下:
1. fgets()函数的第2个参数指明了读入的字符的最大数量。如果该参数的
值是n,那么fgets()将读入n-1个字符,或者读到遇到第一个换行符为止。
2. fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不同,
gets()会丢弃换行符。
3. fgets()函数的第3个参数指明要读入的文件。如果读入从键盘输入的数据,
则以stdin(标准输入)作为参数,该标识符定义在stdio.h中
*/
//fgets()只会读取STLEN-1个字符,或者读到第一个换行符,并在后面追加\0
fgets(words, STLEN, stdin);
printf("Your string twice (puts(), then fputs()):\n");
//puts()在输出时会自动追加换行符\n
puts(words);
/*
fputs()在输出时不会自动追加换行符\n
fputs()函数返回指向char的指针。如果一切进行顺利,该函数
返回的地址与传入的第1个参数相同。但是,如果函数读到文件
结尾,它将返回一个特殊的指针:空指针(null pointer)。该
指针保证不会指向有效数据,所以可以用于标识这种特殊情况。
在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替
更常见(如果在读入数据时出现某些错误,该函数也返回NULL)。
*/
fputs(words, stdout);
puts("Enter another string, please.");
fgets(words, STLEN, stdin);
printf("Your string twice (puts(), then fputs()):\n");
puts(words);
fputs(words, stdout);
puts("\nDone.");
//通常gets()与puts()配对使用
//通常fgets()与fputs()配对使用
system("pause");
return 0;
}
示例二
//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define STLEN 10
//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
char words[STLEN];
puts("Enter strings (empty line to quit): ");
//迭代读取当前行
//在用户按下回车键之前,输入都被储存在临时存储区(即,缓冲区)
//按下回车键时,整行输入才被发送给fgets()
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
//对于输出,fputs()把字符发送给另一个缓冲区,当发送换行符时,
//缓冲区中的内容被发送至屏幕上。
fputs(words, stdout);
puts("Done.");
//处理掉换行符方式
/*
int i = 0;
while (words[i] != '\n')
i++;
words[i] = '\0';
*/
//丢弃输入行中多余字符
//while (getchar() != '\n')
//continue;
system("pause");
return 0;
}
示例三
//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define STLEN 10
//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
char words[STLEN];
int i;
puts("Enter strings (empty line to quit): ");
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
{
i = 0;
while (words[i] != '\n' && words[i] != '\0')
i++;
if (words[i] == '\n')
words[i] = '\0';
else //如果word[i] == '\0'则执行这部分代码
while (getchar() != '\n')
continue;
puts(words);
}
puts("Done.");
system("pause");
return 0;
}
空字符和空指针
从概念上看,两者完全不同。空字符('\0')是用于标记C字符串末尾的字符,其对应字符编码是0。由于其他字符的编码不可能是0,所以不可能是字符串的一部分。
空指针(或NULL)有一个值,该值不会与任何数据的有效地址对应。通常,函数使用它返回一个有效地址表示某些特殊情况发生,例如遇到文件结尾或未能按预期执行。
空字符是整数类型,而空指针是指针类型。两者有时容易混淆的原因是:它们都可以用数值0来表示。但是,从概念上看,两者是不同类型的0。另外,空字符是一个字符,占1字节;而空指针是一个地址,通常占4字节。