C++中的 gets和puts函数详细讲解
,gets()
和puts()
函数都是C语言标准库中的函数,而C++是兼容C语言的,所以C++中也可以使用这些函数。
gets()
函数的作用是从标准输入设备(通常是键盘)读取一行字符串,并将其存储到指定的字符数组中。它的函数原型如下:
char* gets(char* str);
其中,str
是一个指向字符数组的指针,用于存储读取到的字符串。gets()
函数会一直读取输入,直到遇到换行符或文件结束符(EOF)。注意,由于gets()
函数没有对输入进行长度限制,因此可能会导致缓冲区溢出等问题,建议使用更安全的函数fgets()
来代替。
puts()
函数的作用是将一个以空字符('\\0')结尾的字符串输出到标准输出设备(通常是屏幕)。它的函数原型如下:
int puts(const char* str);
其中,str
是一个指向以空字符结尾的字符串的指针。puts()
函数会自动在字符串后面添加换行符,并将其输出到标准输出设备中。它返回一个非负整数,表示输出的字符数(包括换行符)。
需要注意的是,由于puts()
函数会自动添加换行符,因此如果不想在输出的字符串后添加换行符,可以使用printf()
函数来代替。
举例说明:
当你想要从用户输入中获取一个字符串并将其存储到字符数组中时,可以使用gets()
函数,例如:
#include <iostream> #include <cstring> using namespace std; int main() { char str[50]; cout << "请输入一个字符串:"; gets(str); // 从标准输入中获取字符串并存储到str中 cout << "你输入的字符串是:" << str << endl; return 0; }
当你想要将一个字符串输出到屏幕上时,可以使用puts()
函数,例如:
#include <iostream> #include <cstring> using namespace std; int main() { char str[] = "Hello, world!"; puts(str); // 输出字符串到屏幕上,自动添加换行符 return 0; }
需要注意的是,使用gets()
函数时,应该保证输入的字符串不超过指定的字符数组长度,否则可能会导致缓冲区溢出等问题。因此,建议使用更安全的fgets()
函数来代替。而对于puts()
函数,需要注意它会自动添加换行符,如果不需要换行符,可以使用printf()
函数来代替。
gets(str) 时候如何在最后输入'\\0'呢?
gets()
函数会在读取到换行符或文件结束符(EOF)时停止读取,然后将读取的字符序列存储到指定的字符数组中,并在最后自动添加一个空字符('\\0')作为字符串的结尾。因此,在使用gets()
函数时,不需要手动在输入的字符串最后添加空字符,函数会自动添加。
需要注意的是,由于gets()
函数没有对输入进行长度限制,可能会导致缓冲区溢出等问题。因此,建议使用更安全的函数fgets()
来代替gets()
函数,同时需要在字符数组的大小和读取字符的最大长度之间做好适当的控制。例如:
#include <iostream> #include <cstring> using namespace std; int main() { char str[50]; cout << "请输入一个字符串:"; fgets(str, 50, stdin); // 从标准输入中获取字符串并存储到str中,最大长度为49(保留1个字符给空字符) str[strcspn(str, "\\n")] = '\\0'; // 删除fgets()读取时添加的换行符 cout << "你输入的字符串是:" << str << endl; return 0; }
在上述代码中,使用了fgets()
函数代替了gets()
函数,并在字符数组大小和读取最大长度之间进行了适当的控制。同时,由于fgets()
函数会读取换行符并将其存储到字符数组中,因此使用strcspn()
函数找到换行符的位置,并将其替换为空字符,以确保字符串以空字符结尾。
在使用puts()
函数时,需要引用头文件<cstdio>
或<stdio.h>
,但不需要引用头文件<cstring>
。因为puts()
函数只接受一个C风格的字符串作为参数,而C风格字符串的类型是字符数组(char array),不是C++标准库中的std::string
类型。因此,puts()
函数不需要使用C++标准库中的<string>
头文件,只需要使用C标准库中的<cstdio>
或<stdio.h>
头文件即可。