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
.
动态分配内存
我正在尝试对两个 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
.