如何在C中将常量char指针转换为小写?

时间:2015-08-18 03:38:58

标签: c pointers

我有一个接收const char*的函数,我想将它转换为小写。但是我得到了错误:

error: array initializer must be an initializer list or string literal

我试图将字符串变量复制到另一个数组,以便我可以小写它。但我觉得我有些困惑。

这是我的功能:

int convert(const char* string)
{
    char temp[] = string;
    temp        = tolower(temp); //error is here
    //do stuff
}

我很难理解这个错误意味着什么,有人可以帮忙解释一下吗?

3 个答案:

答案 0 :(得分:4)

tolower接受一个字符并以小写形式返回。

即使没有,数组也不可分配。数组和指针不是一回事。

你可能想做类似的事情:

char *temp = strdup(string); // make a copy

// adjust copy to lowercase
unsigned char *tptr = (unsigned char *)temp;
while(*tptr) {
    *tptr = tolower(*tptr);
    tptr++;
}

// do things

// release copy
free(temp);

确保您了解堆和堆栈之间的区别以及影响字符串文字的规则。

答案 1 :(得分:0)

请注意,tolower()接受一个字符而不是字符串:

int tolower ( int c ); 

此外,您正尝试将字符串从string复制到temp[]变量。 C中的=运算符没有重载,无法将字符串复制到char数组中。

现在关于你的错误:

  

错误:数组初始值设定项必须是初始化列表或字符串文字

它表示必须通过初始单个项目列表初始化数组,或者您可以直接指定字符串文字。

E.g:

  

char temp [] =“嗨”;

     

char temp [] = {'H','i','\ 0'};

另外,请检查您的陈述:

temp = tolower(temp);

此处tolower()的返回类型为int,您将其分配给数组temp,这是不合适的。

您可以使用 strlwr()来使用以下代码段:

int convert(const char* string)
{
    char *temp= malloc(strlen(string)+1);
    strcpy(temp,string);
    strlwr(temp);
    //do your stuff
}

答案 2 :(得分:0)

首先,tolower需要charint,而不是字符串。

但即使您通过char,您的代码也无法正常工作,因为此错误array initializer must be an initializer list or string literal,意味着您必须使用以下方法之一对其进行初始化:

char arr[4] = {'h', 'e', 'y','\0'}; // initializer list
char arr[4] = "hey"; // string literal

char arr[] = "hey"; // also a string literal

char arr[4];

arr[0] = 'h';
arr[1] = 'e';
arr[2] = 'y';
arr[4] = '\0';