2

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

const char' to错误:从const char*' 初始化参数 1 的 `size_t strlen(const char*)' 分配只读位置的无效转换

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

8 回答 8

1

您可能想要运行strlen(string)- 就像strlen(string[i])尝试获取单个字符的长度一样。

于 2013-11-17T21:47:43.097 回答
1

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

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

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

于 2013-11-17T21:48:33.463 回答
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);
};

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

于 2013-11-17T22:14:11.887 回答
0

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

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

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

于 2013-11-17T21:58:05.063 回答
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);
}
于 2014-08-09T13:50:54.133 回答
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
        }
    }
}
于 2013-11-18T01:31:53.523 回答
0

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

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

const char* strings[];

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

于 2013-11-17T22:02:00.937 回答
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;
}
于 2014-12-26T06:42:35.600 回答