C风格的字符串

时间:2016-10-26 12:12:25

标签: c string tolower

我正在尝试对两个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]);

工作正常,所以我认为与你们有些人可能认为的无效终止无关。

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

2 个答案:

答案 0 :(得分:3)

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

制作此API有三种选择:

  • 取一个非const str并执行适当的修改
  • 从调用者那里获取字符串的缓冲区,并假设它有足够的长度,或者也考虑缓冲区的大小(更安全)
  • 返回malloc个字符串。这将要求调用者释放结果。如果您决定采用这条路线,请注意您需要malloc strlen(str)+1字节来容纳空终结符。

答案 1 :(得分:2)

return buffer;

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