将char数组分配给另一个,这也是c中函数的参数

时间:2017-09-06 05:53:21

标签: c arrays char parameter-passing

我运行此代码并每次都关闭控制台。

你可以帮帮我吗?谢谢

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数组更改为参数?

2 个答案:

答案 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建议或替代方案,你可以在函数的开头加上两个指向freetemp的指针{ {1}}并使用这两个指针来复制字符串。