首页 文章

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

提问于
浏览
2

我对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 回答

  • 1

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

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

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

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

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

  • 0

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

  • 0

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

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

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

  • 0

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

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

    const char* strings[];
    

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

  • 1

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

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

    Code example:

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

相关问题