示例一
//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字节。