首页 > 解决方案 > 创建一个函数,将每个单词的第一个字母大写并将所有其他字母转换为小写

问题描述

我有这个练习将给定句子中的第一个字符大写。请我不明白“i - 1”和str [i - 1]是什么意思

#include <stdio.h>
char* ft_strcapitalize(char *str)
{
    int i;

    i = 0;
    while (str[i])
    {
        if ((i - 1 == 0 && str[i] != ' ')
            || (str[i - 1] >= 'a' && str[i - 1] <= 'z')
            || (str[i - 1] >= 'A' && str[i - 1] <= 'Z')
            || (str[i - 1] >= '1' && str[i - 1] <= '9'))
        {
        }
        else if (str[i] >= 'a' && str[i] <= 'z')
                str[i] -= 32;
        i++;
    }
    return (str);
}

int main(void)
{
    char s[] = "salut, comment  tu vas ? 42mots quarante-deux; cinquante+et+un";
    ft_strcapitalize(s);
    printf("%s", s);
}

标签: cif-statementwhile-loopincrement

解决方案


请我不明白“i - 1”和 str[i - 1] 是什么意思

str[i - 1]尝试访问字符串中的前一个字符 - 之前的那个str[i]。使用 when 是不好的代码i==0


创建一个函数,将每个单词的第一个字母大写并将所有其他字母转换为小写

保持一个状态变量标识下一个字符可能开始一个句子。使用<ctype.h>.

#include <ctype.h>
#include <stdbool.h>

char* ft_strcapitalize(char *str) {
  size_t i = 0;
  bool start = true; 
  while (str[i]) {
    if (start && isalpha(str[i])) {
      str[i] = toupper(str[i]);
      start = false;
    } else {
      str[i] = tolower(str[i]);
      // TBD: Adjust 'start' detection as needed.
      if (str[i] == '.' || str[i] == '?' || str[i] == '!') {
        start = true;
      }
    }
    i++;
  }
  return str;
}

推荐阅读