首页 > 解决方案 > 如何递归地使字符串中所有单词的首字母大写?

问题描述

我想知道我该怎么做这个。我不想要任何迭代或 isalpha() 和 toupper() 函数。我们想使用我们自己的代码来读取输入。我们假设用户输入所有字符小写。这是我迄今为止尝试过的:

define MAX_LENGTH 100

int read_line(char str[],int);
void capitalize(char[]);

int main (void){
    char A[MAX_LENGTH];
printf("Enter a text \n");
read_line(A, MAX_LENGTH);

capitalize(A);
puts(A);


}

int read_line(char str[],int n){
    int ch,i=0;

    while ((ch = getchar()) != '\n'){
        if(i<MAX_LENGTH)
            str[i++] = ch;
    }
    str[i] = '\0';
    return i;
}

void capitalize(char str[]){
 int x = strlen(str);
 static int i = 0;
    if(str[i]=='\0')
    return;
    if(str[i-1]==' '|| i == 0)
      str[i] -= 32;
      i++;
      return capitalize(&str[i]);
 }

输出是这样的:

输入文字:

自卫队自卫队

自卫队 自卫队 df

我的代码有什么问题?

标签: cfunctionrecursionc-stringscapitalize

解决方案


主要问题是您同时使用索引和递归,简单的递归解决方案是:

void capitalize(char* str, bool start){
    if (!*str) return; // end as soon as \0 is met
    if (start) 
        if (*str >= 'a' && *str <= 'z') *str = (*str - 'a') + 'A'; // capitalize latin letters
    capitalize(str + 1, *str == ' '); // work with next symbol
}

应该称为capitalize(str, true)


推荐阅读