我正在尝试对两个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的问题,但没有一个能够帮助解决我的问题。
答案 0 :(得分:3)
您无法从函数返回局部变量,因此返回buffer
是未定义的行为。
制作此API有三种选择:
str
并执行适当的修改malloc
个字符串。这将要求调用者释放结果。如果您决定采用这条路线,请注意您需要malloc
strlen(str)+1
字节来容纳空终结符。答案 1 :(得分:2)
return buffer;
返回指向ToLowerCase
本地变量的指针,指针将在调用后指向垃圾,导致在尝试取消引用指针时出现未定义的行为。要么更改str
本身,要么为buffer
动态分配内存。