我运行此代码并每次都关闭控制台。
你可以帮帮我吗?谢谢int lower(int a)
{
if ((a >= 0x41) && (a <= 0x5A))
a |= 0x20;
return a;
}
void get_lower_case(char** str)
{
int str_len = strlen(*str);
char *temp = (char *)malloc(str_len);
while (**str)
{
*temp =lower(**str);
temp++;
*str++;
}
strncpy( *str, temp, str_len);
free(temp);
}
int main()
{
char searchChars[] = "findstring";
get_lower_case(&searchChars);
return (0);
}
还是有其他方法可以将char数组更改为参数?
答案 0 :(得分:1)
继续注释,不需要将指向char 的指针传递给get_lower_case
。您在searchChars
中有一个可修改的字符串,因此只需传递字符串并对其中的字符进行操作即可。您将非常简单地转换为小写。
此外,请勿在代码中使用幻数,例如(a >= 0x41) && (a <= 0x5A)
,(a >= 'A') && (a <= 'Z')
更容易阅读。您可以将0x20
保留为32
。
将各个部分放在一起,您可以执行以下操作:
#include <stdio.h>
int lower(int a)
{
if ((a >= 'A') && (a <= 'Z'))
a |= 0x20;
return a;
}
void get_lower_case (char *str)
{
while (*str) {
*str = lower(*str);
str++;
}
}
int main (void)
{
char searchChars[] = "FINDstring";
get_lower_case(searchChars);
printf ("%s\n", searchChars);
return (0);
}
示例使用/输出
$ ./bin/tolower
findstring
答案 1 :(得分:0)
问题在于while
循环以及为将字符串从源复制到目标而编写的逻辑。
while (**str)
{
*temp =lower(**str);
temp++; //pointer is moved to next location of memory
*str++; //pointer is moved to next location of memory
}
strncpy( *str, temp, str_len); //at this point both pointers are pointing to the end of the string
free(temp); //pointer is pointing to the end of the memory
在while
循环中,两个指针都递增到内存的下一个位置,在该循环结束时,两个指针都指向字符串的结尾,下一个语句是strncpy()
和{{ 1}}显然会失败,因为free()
会将垃圾值复制到strncpy
并且str
已移至结束,因此对temp
的调用也将失败。
最好的解决方案是上面提到的@David C. Rankin建议或替代方案,你可以在函数的开头加上两个指向free
和temp
的指针{ {1}}并使用这两个指针来复制字符串。