如何在C中识别C风格的字符串?

问题描述 投票:0回答:2

在 C 中,一个函数可能会请求或给出一个 C 风格的字符串,也可能不会。或者退货。

如何区分 C 风格的字符串和非 C 风格的字符串?有没有一种惯用的通用方法来做到这一点?

也许你可以使用宏,比如

#define C_STRING char*        

它生成相同的代码,但它告诉正在使用什么类型的字符串。

c string conventions
2个回答
0
投票

“非 C 风格的字符串”是什么意思? C 中唯一存在的字符串是以零

'\0'
字节结尾的字符序列。

如果您正在考虑一种带有字符串长度的类型,例如 C++

std::string
,那么这在 C 中不存在。

在 typedef 或 #define 后面隐藏 C 字符串是数组(或指针)的事实是邪恶的,应不惜一切代价避免。哈佛CS50请注意


0
投票

一个函数可能会要求或给出一个 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.