1

我正在尝试对两个 C 风格的字符串执行不区分大小写的 strcmp。

我有一个将 C 风格的字符串转换为小写的函数。

char* ToLowerCase(const char* str)
{
    char buffer[strlen(str)];
    for (int i=0; i<strlen(str); ++i)
        buffer[i] = char(tolower(str[i]));
    return buffer;
}

一个字符串来自函数 char* GetMyString(int i),第二个来自 C 风格字符串数组 char* myStrings[5]。

所以假设 GetMyString(0) 和 myString[0] 都返回 "TEXT"

strcmp(ToLowerCase(GetMyString(0)), ToLowerCase(myStrings[0]));

比较诸如“mytextxaogs5atx”“mytextxabs5atx”之类的字符串(添加了一些随机文本......)

同时

strcmp(GetMyString(0), myStrings[0]);

工作得很好,所以我认为与你们中的一些人可能认为的空终止无关。

我的代码有什么问题?我错过了什么?我看过很多关于 tolow 的问题,但没有一个能够帮助我解决问题。

4

2 回答 2

3

您不能从函数返回局部变量,因此返回buffer是未定义的行为。

你有三个选择来制作这个 API:

  • 采用非常量str并就地执行修改
  • 从调用者那里获取字符串的缓冲区,并假设它有足够的长度,或者也获取缓冲区的大小(更安全)
  • 返回一个malloc-ed 字符串。这将要求调用者释放结果。如果您决定走这条路,请注意您需要malloc strlen(str)+1字节来容纳空终止符。
于 2016-10-26T12:15:44.183 回答
2
return buffer;

您返回一个指向本地变量的ToLowerCase指针,该指针将在调用后指向垃圾,在尝试取消引用指针时导致未定义的行为。要么改变str自身,要么动态分配内存buffer

于 2016-10-26T12:16:19.603 回答