如何制作递归函数,将大写字母放在这个“。”的前面和后面字符

how to make recursive function thats put uppercase letter at first and after this '.' char

  1. 该字符串是一个句子,而不是一个单词。
  2. 必须是递归的。
  3. 这里我是怎么做到的。第一个函数改变第一个字母。第二个函数将小写字母放在其余部分。

这是我尝试过的:

void changeWord(char *str){ 
    if (*str >= 'a' && *str <= 'z')
        *str  = *str - 32;   //stop condition.
    changeRest(str+1);
}


void changeRest(char *str){
    if (*str !=0){   //STOP CONDITION.
        if (*str >= 'A' && *str <= 'Z'){  //if its upper.
            *str  = *str +32; //change it to lower
        }
        changeRest(str+1); //call the new string -1.
    }
    return;
}

ctype.h中的函数toupper和tolower一般是这样实现的:

char tolower (char ch)
{
  if ((ch >= 'A') && (ch <= 'Z')) 
  {
    ch = (ch - 'A') + 'a';
  }

  return ch;
}


char toupper (char ch)
{
  if ((ch >= 'a') && (ch <= 'z'))
  {
    ch = (ch - 'a') + 'A';
  }

  return ch;
}

您的递归函数需要一个额外的参数来指示它是否在句子的开头。将您的代码组合成一个函数而不是两个函数更有意义。例如:

void capitalize(char *str, int sentence_start){
    if (*str == '[=10=]') {   //STOP CONDITION.
        return;
    } else if (*str == '.') {
        sentence_start = 1;
    } else if (*str >= 'a' && *str <= 'z') {
        if (sentence_start) {
            *str = *str - 'a' + 'A';
            sentence_start = 0;
        }
    } else if (*str >= 'A' && *str <= 'Z') {
        if (sentence_start) {
            sentence_start = 0;
        } else {
            *str = *str - 'A' + 'a';
        }
    }
    capitalize(str + 1, sentence_start);
}

如果首字母大写,对该函数的顶级调用将传递 sentence_start 非零值;如果您不想手动执行此操作,您可以编写一个包装函数来为您执行此操作。

当然,上面假设大小写字母分别出现在一个连续的字符代码块中,大小相同,顺序相应,'a'(分别为'A')在开头和结尾处 'z'(分别为 'Z')。那是 U.S.-centric,但这似乎是您的要求所针对的。

迭代函数在这里可以很好地工作。 这是一个双重递归解决方案。

#include <string.h>

int my_isalpha(char ch) {
  return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}

char my_toupper(char ch) {
  if (ch >= 'a' && ch <= 'z') {
    ch = ch - 'a' + 'A';
  }
  return ch;
}

int EndOfSentence(int ch) {
  return !!strchr(".?!\n\v\r", ch);
}

void Sentence_Case(char *src);

static void Normal_Case(char *src) {
  while (*src) {
    if (EndOfSentence(*src)) {
      Sentence_Case(src + 1);
      return;
    }
    src++;
  }
}

void Sentence_Case(char *src) {
  while (*src) {
    if (my_isalpha(*src)) {
      *src = my_toupper(*src);
      Normal_Case(src + 1);
      return;
    }
    src++;
  }
}

#include <stdio.h>
int main(void) {
  char s[] = "good job. sir";
  Sentence_Case(s);
  puts(s);
  return 0;
}

这满足了您的所有要求。

假设:

  • 提供的缓冲区包含有效的 C 风格字符串
  • 提供的指针不为空。
  • 字符串中出现句点严格表示句子结束。
  • 从上面看,没有嵌入浮点数。因此 "pi is about 3.14" 是无效的(虽然这应该处理它)。
  • 字符集为原生C字符集(ASCII,7位)

代码,包括助手

// Keep all helpers as functions to avoid side effects of calls
// such as toupper(text++).

unsigned char toupper(unsigned char c)
{
    return (c >= 'a' && c <= 'z') ? c - ('A' - 'a') ? c;
}

// All characters in the ranges [0,' '] and [0x7f,inf) are either
// whitespace, control characters, or otherwise non-printable.
int iswhitespace(unsigned char c)
{
    return (c <= ' ' || c >= 0x7f)
}

int isalpha(unsigned char c)
{
    unsigned char uc = toupper(c);
    return uc >= 'A' && uc <= 'Z';
}

// Note that identifiers beginning with "str" are reserved 
// by the standard library.

void Capitalize(unsigned char *text)
{
    // Base condition: at the end of the string
    if (! *text)
        return;

    // At the beginning of a sentence. Capitalize the first char.
    *text = toupper(*text);

    // Find the next sentence and recurse
    for (text++; *text && *text != '.'; text++);
    for (text++; *text && iswhitespace(*text); text++);
    Capitalize(text);
}