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

时间:2013-11-17 21:43:05

标签: c arrays string function toupper

我对C很陌生,在创建以下功能时遇到了障碍。我想使用这个函数来为一个静态字符数组(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]);
                        }
         }
}

8 个答案:

答案 0 :(得分:1)

您可能希望运行strlen(string) - 因为strlen(string[i])正在尝试获取单个字符的长度。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

你缺少if语句的结束花括号。这可能只是问题中的拼写错误,但为了以防提及它。

您的功能被宣布无效。这意味着它什么都不返回。任何return语句都应该在单词后面没有任何内容,因为函数没有返回任何内容,并且在很多情况下你根本就没有return语句。

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

答案 3 :(得分:0)

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

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

const char* strings[];

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

答案 4 :(得分:0)

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

#include <stdio.h> // Now I am able to use printf.
#include <string.h> // 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<x;i++){
         if (isalpha(string[i]) && string[i-1] == ' '){ 
         // only first letters of a word.
             string[i]= toupper(string[i]);
         }
    }
}

main(){
  char string[] = "text with lowercase words.";
  Cap(string);
  printf("%s",string);
};

该文字的第一个字仍然是小写字母。这是你的任务。

答案 5 :(得分:0)

替代方法:(写一个函数)

1) (可选)为调用函数的结果分配相同长度的新缓冲区的内存。
2) 在功能中 - 将新字符串的第一个字符串设置为原始字符串的大写版本
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
        }
    }
}

答案 6 :(得分:0)

这应该可以正常工作。

#include <stdio.h>
#include <string.h>

capital(char s[])
{
    int i;
    for(i=0; i<strlen(s); i++)
    {
        if (i==0||s[i-1]==' '&&s[i]>='a'&&s[i]<='z')
            s[i]=toupper(s[i]);
    }
    puts(s);
}

main()
{
    char s[100];
    printf("Enter a line: ");
    gets(s);
    capital(s);
}

答案 7 :(得分:0)

我根据Stefan Bollmann回复进行了更新:

#include <string.h>
#include <stdio.h>

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;
}