我对C很陌生,在创建下面这个功能时我会碰壁 . 我想使用这个函数来为一个静态字符数组(char string []创建单词大写的第一个字母 . 它看起来不错,但我得到一些语法错误,这可能是非常基本的 . 编译器错误:
错误:来自const char的无效转换'toconst char *'初始化`size_t strlen(const char *)的参数1'只读位置的赋值
void Cap(char string[]){
int i;
int x = strlen(string);
for (i=1;i<x;i++){
if (isalpha(string[i]) && string[i-1] == ' '){
// only first letters of a word.
string[i]= toupper(string[i]);
}if (isalpha(string[0]))
{
string[0]=toupper(string[0]);
}
}
}
8 回答
我还会指出你的牙套不匹配......
删除if行上的大括号或在分配语句后放置一个大括号 .
我拿了你的代码并试图编译它 . 好吧,下次看到可编译的代码会很高兴 . 这是一个评论 .
文本的第一个单词仍然是小写的 . 这是一项任务 .
您可能想要运行
strlen(string)
- 因为strlen(string[i])
正在尝试获取单个字符的长度 .你错过了if语句的结束大括号 . 这可能只是问题的一个错字,但提到它以防万一 .
您的函数声明为void . 这意味着它什么都不返回 . 因为函数没有返回任何内容,所以任何return语句都应该没有任何内容,并且在很多情况下你根本就没有return语句 .
然而,最大的问题是,这不是一个字符数组,只是一个字符串 .
char* string
和char string[]
两者(可能)都是指一个字符数组,它构成一个字符串 . 您需要使用另一级别的间接来引用一个字符数组数组:char** strings
,char* strings[]
或char strings[][]
. 最后一个表单需要您指定所有字符串的长度,因此您通常只使用前两个字符串 .这里的问题是你传入一个字符串,而不是一个字符串数组 .
基本上在C中,字符串是一个字符数组,因此字符串数组是一个二维数组,如下所示:
代码还有一些其他问题 . 在使用之前,您尚未初始化i .
另一种方法:(写一个函数)
1) (可选)为调用函数的结果分配相同长度的新缓冲区的内存 .
2) 在函数中 - 将新字符串的第一个char设置为原始字符串的大写版本
3) 遍历搜索空格的字符串 .
4) 对于每个空格,将新字符串的下一个字符设置为原始字符串中字符的大写字母
5) 循环4)直到检测到NULL
6) 在调用程序中释放任何已分配的内存 .
Code example:
这应该工作得很好 .
我根据Stefan Bollmann答案进行了更新: