tolower 用于 C 风格的字符串

tolower for C-style strings

我正在尝试对两个 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] 都 return "TEXT"

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

比较像 "mytextxaogs5atx" "mytextxabs5atx" 这样的字符串(添加了一些随机文本...)

同时

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

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

我的代码有什么问题?我错过了什么?我看过很多关于 tolower 的问题,但其中 none 能够帮助解决我的问题。

您不能 return 函数中的局部变量,因此 returning buffer 是未定义的行为。

你有三个选择来做这个API:

  • 取一个非常量str并就地进行修改
  • 为调用者的字符串取一个缓冲区,要么假设它有足够的长度,要么也取缓冲区的大小(更安全)
  • Return 一个 malloc 编辑的字符串。这将要求调用者释放结果。如果您决定走这条路,请注意您需要 malloc strlen(str)+1 字节来容纳空终止符。
return buffer;

您 return 一个指向 ToLowerCase 局部变量的指针,该指针将在调用后指向垃圾,从而在尝试取消引用该指针时导致未定义的行为。要么更改 str 本身,要么为 buffer.

动态分配内存