C函数用于大写数组中单词的第一个字母

我对C很陌生,在创建以下function时遇到了障碍。 我想使用这个函数来为一个静态字符数组(char string []创建单词大写的第一个字母。它看起来不错,但我得到一些语法错误,这可能是非常基本的。编译器错误:

错误:无效转换从const char' to const 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]); } } } 

我拿了你的代码并尝试编译它。 好吧,下次看到可编译的代码会很高兴。 这是一个评论。

 #include  // Now I am able to use printf. #include  // I was not able to use strlen without this... void Cap(char string[]){ int i; int x = strlen(string); // You want to get the length of the whole string. for (i=1;i 

文本的第一个单词仍然是小写的。 这是一项任务。

你可能想运行strlen(string) – 因为strlen(string[i])试图获取单个char的长度。

我还会指出你的牙套不匹配……

 if (isalpha(string[i])){ string[i]= toupper(string[i]); 

删除if行上的大括号或在分配语句后放置一个大括号。

你错过了if语句的结束大括号。 这可能只是问题中的一个错字,但提到它以防万一。

您的函数声明为void。 这意味着它什么都不返回。 由于函数没有返回任何内容,因此任何return语句都应该在单词后面没有任何内容,并且在很多情况下你根本就没有return语句。

但是,最大的问题是这不是一个字符串数组。 它是一个字符数组,只是一个字符串。 char* stringchar string[]两者(可能)引用一个字符数组,它组成一个字符串。 您需要使用另一级别的间接来引用字符数组数组: char** stringschar* strings[]char strings[][] 。 最后一个表单需要您指定所有字符串的长度,因此您通常只使用前两个字符串。

这里的问题是你传入的是一个字符串,而不是一个字符串数组。

基本上在C中,字符串是一个字符数组,因此字符串数组是一个二维数组,如下所示:

 const char* strings[]; 

代码还有一些其他问题。 在使用之前,您尚未初始化i。

另一种方法:(写一个函数)

1) (可选)为相同长度的新缓冲区分配内存以产生调用function。
2)在函数中 – 将新字符串的第一个char设置为原始字符串的大写版本
3)遍历字符串搜索空格。
4)对于每个空格,将新字符串的下一个字符设置为原始字符串中的字符串的大写字母
5)循环4)直到检测到NULL
6)在调用程序中释放任何已分配的内存。

代码示例:

 void capitalize(char *str, char *new) { int i=0; new[i] = toupper(str[0]);//first char to upper case i++;//increment after every look while(str[i] != '\0') { if(isspace(str[i])) { new[i] = str[i]; new[i+1] = toupper(str[i+1]);//set char after space to upper case i+=2;//look twice, increment twice } else { new[i] = str[i];//for no-space-found, just copy char to new string i++;//increment after every look } } } 

这应该工作得很好。

 #include  #include  capital(char s[]) { int i; for(i=0; i='a'&&s[i]<='z') s[i]=toupper(s[i]); } puts(s); } main() { char s[100]; printf("Enter a line: "); gets(s); capital(s); } 

我根据Stefan Bollmann的回答做了更新:

 #include  #include  char* uc_words(char string[]) { int i; int x = strlen(string); int counter = 0; for (i = 0; i < x; i++) { // If found a white-space reset counter if (isspace(string[i])) counter = 0; // Check if first character in word if (isalpha(string[i]) && !isspace(string[i]) && counter == 0) { string[i]= toupper(string[i]); counter = 1; } } return string; } int main() { char string[] = "hello world"; printf("%s\n", uc_words(string)); return 0; }