scanf 读取字符串
在C++中,scanf
是C语言标准库函数,不能直接读取 std::string
类型,因为它设计用于处理C风格字符串(char*
)。若要使用 scanf
读取字符串,需按以下方式处理:
一、使用 scanf
读取C风格字符串(char[]
)
1. 基础用法
#include <cstdio>int main() {char str[100];scanf("%s", str); // 读取字符串,遇空格或换行停止printf("%s\n", str);return 0;
}
2. 安全风险:缓冲区溢出
若输入超过数组长度,会导致溢出。安全写法:
char str[10];
scanf("%9s", str); // 最多读取9个字符,预留1个位置给'\0'
二、scanf
读取含空格的字符串
1. 使用扫描集(%[
)
char str[100];
scanf("%99[^\n]", str); // 读取直到换行符,最多99个字符
getchar(); // 消耗掉缓冲区的换行符
2. 示例:读取整行
#include <cstdio>int main() {char str[100];scanf("%99[^\n]", str); // 读取整行(含空格)printf("读取的内容:%s\n", str);return 0;
}
三、将C风格字符串转为 std::string
若需要 std::string
类型,可在读取后转换:
#include <cstdio>
#include <string>int main() {char buffer[100];scanf("%99s", buffer); // 读取到C风格字符串std::string str(buffer); // 转换为std::stringprintf("C风格字符串:%s\n", buffer);printf("std::string:%s\n", str.c_str());return 0;
}
四、为什么 scanf
不能直接读取 std::string
?
- 类型不匹配:
scanf
是C语言函数,不认识C++的std::string
。 - 内存管理:
std::string
需动态分配内存,而scanf
只能操作预先分配的C数组。
五、C++推荐:使用 std::cin
或 getline
1. 读取不含空格的字符串
#include <iostream>
#include <string>int main() {std::string str;std::cin >> str; // 遇空格停止std::cout << str << std::endl;return 0;
}
2. 读取含空格的整行
#include <iostream>
#include <string>int main() {std::string line;std::getline(std::cin, line); // 读取整行std::cout << line << std::endl;return 0;
}
六、总结
需求 | 推荐方法 | 示例代码 |
---|---|---|
读取不含空格的字符串 | scanf + C风格字符串 | char str[100]; scanf("%99s", str); |
读取含空格的字符串 | scanf + 扫描集 | scanf("%99[^\n]", str); |
直接使用 std::string | std::cin 或 getline | std::string s; std::getline(cin, s); |
建议:在C++中优先使用 std::cin
和 getline
,它们更安全且直接支持 std::string
。仅在性能敏感或兼容C代码时使用 scanf
。