在 C 中,一个函数可能会请求或给出一个 C 风格的字符串,也可能不会。或者退货。
如何区分 C 风格的字符串和非 C 风格的字符串?有没有一种惯用的通用方法来做到这一点?
也许你可以使用宏,比如
#define C_STRING char*
它生成相同的代码,但它告诉正在使用什么类型的字符串。
“非 C 风格的字符串”是什么意思? C 中唯一存在的字符串是以零
'\0'
字节结尾的字符序列。
如果您正在考虑一种带有字符串长度的类型,例如 C++
std::string
,那么这在 C 中不存在。
在 typedef 或 #define 后面隐藏 C 字符串是数组(或指针)的事实是邪恶的,应不惜一切代价避免。哈佛CS50请注意
一个函数可能会要求或给出一个 C 风格的字符串,
没有。 C 库定义了“字符串是由第一个空字符终止并包括第一个空字符的连续字符序列”。一个函数可以接收一个指向字符串的指针,但不能接收一个string。同样,一个函数可能会返回一个指向字符串的指针,但不会返回一个字符串。
通常这个指针是一个
char *
或const char *
。许多 C 库字符串函数假定指针指向一个内存序列,该内存序列最终包含一个 null 字符。如果没有,结果是 undefined behavior (UB).
这不是“How to identify a C-style string in C in C?”的测试。除了有效内存中存在空字符外。
我们可以根据大小限制测试:
bool valid_c_string(size_t sz, const char *s) {
return memchr(s, '\0', sz) != NULL;
}