我正在尝试创建一个接受字符串的函数,并将所有小写字母转换为大写,其他所有字母转换为零,然后打印字符串。这就是我所拥有的:
void upperAndZeros(char* toUpper) {
char *toReturn[(sizeof(toUpper) / sizeof(*toUpper)) + 1];
int i;
for (i = 0; toUpper[i] != '\0'; i++) {
if (toUpper[i] >= 'a' && toUpper[i] <= 'z') {
toReturn[i] = (char) toupper(toUpper[i]); //this is line 127 in the code
} else {
toReturn[i] = (char) 0;
}
}
toReturn[i] = '\0';
printf("The modified string is '%s'", toReturn);
}
但是当我去编译这个时,我得到以下错误:
127:25 warning: assignment makes pointer from integer without a cast
答案 0 :(得分:3)
您收到的错误是因为您在char
数组中尝试char *
toReturn[i] = (char) toupper(toUpper[i]);
您想要一个char
而不是char *
的数组。改变这一行
char *toReturn[(sizeof(toUpper) / sizeof(*toUpper)) + 1];
到
char toReturn[(sizeof(toUpper) / sizeof(*toUpper)) + 1];
你应该做的另一个改变,在评论中建议,sizeof()
在这里不起作用,因为数组在传递给函数时会衰减成指针。 sizeof(toUpper)
将返回指针的大小。阅读this以了解问题。
如果strlen()
指向的字符串已终止NUL,请在此处使用toUpper
。
如果没有,则将长度单独发送给该函数作为另一个参数。
答案 1 :(得分:0)
很多问题,这样的事情会更好:
void upperAndZeros(char* toUpper) {
char toReturn[strlen(toUpper) + 1];
int i;
for (i = 0; toUpper[i] != '\0'; i++) {
if (islower(toUpper[i])) {
toReturn[i] = (char) toupper(toUpper[i]);
} else {
toReturn[i] = '0'; // beware not 0 but char '0'
}
}
toReturn[i] = '\0';
printf("The modified string is '%s'", toReturn);
}