【问题标题】:C function to capitalize first letter of words in an arrayC函数将数组中单词的第一个字母大写
【发布时间】:2013-11-30 22:33:48
【问题描述】:

我对 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]);
                        }
         }
}

【问题讨论】:

  • 如果由于string 参数的const 属性而导致string[i]= toupper(string[i]) 没有抱怨,请获取新的编译器。该参数应该是char string[]。你想要strlen(string),而不是strlen(string[i])。并完全失去return Cap 行。这是一个void 函数。
  • 是的,我在这一行有一个错误,只读位置的分配

标签: c arrays string function toupper


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我还会指出你的大括号不匹配......

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

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

    【讨论】:

      【解决方案3】:

      我拿了你的代码并试图编译它。嗯,下次能看到可编译的代码就好了。这是一个带有 cmets 的。

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

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

      【讨论】:

      • 好的,我已经为数组中的第一个字符串添加了修复: if (isalpha(string[0])) { string[0]=toupper(string[0]); }
      • 由于一些错误,我投了反对票。首先,字符串以 string[0] 而不是 string[1] 开头。并且您的测试,检查之前的字符是 ' ',不适用于字符串中的第一个字符(因为您将在变量外部进行检查,该变量可能包含任何字符)。
      【解决方案4】:

      您的 if 语句缺少右花括号。这可能只是问题中的一个错字,但以防万一。

      您的函数被声明为无效。这意味着它什么也不返回。任何 return 语句都应该在单词后面没有任何内容,因为函数什么都不返回,而且在许多情况下你根本不会有 return 语句。

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

      【讨论】:

      • 好的,感谢您的回复,我确实理解并修复了前两个错误,我会补充一点,我想传递一个句子,即 char sentence [10]="this is a example" 所以char string[] 可以吗?
      • "words in an array" 表明它是一个单词数组,因此会造成混淆。是的,如果您只想将字符串中的单词大写,可以使用char string[]。但是,在尝试将第一个字母大写之前,您需要检查单词之间的某种分隔,因为您当前的逻辑只会将所有单词中的所有字母大写。
      【解决方案5】:

      这里的问题是您传递的是单个字符串,而不是字符串数组。

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

      const char* strings[];
      

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          这应该可以正常工作。

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

          【讨论】:

          • 如果你扩展你的答案会更好,向提问者解释为什么他的编译器会抛出那个错误而不仅仅是提供现成的代码。
          【解决方案8】:

          我根据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;
          }
          

          【讨论】:

          • 谢谢。不要忘记包括:#include
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 2020-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多