如何制作递归函数,将大写字母放在这个“。”的前面和后面字符
how to make recursive function thats put uppercase letter at first and after this '.' char
- 该字符串是一个句子,而不是一个单词。
- 必须是递归的。
- 这里我是怎么做到的。第一个函数改变第一个字母。第二个函数将小写字母放在其余部分。
这是我尝试过的:
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);
}
- 该字符串是一个句子,而不是一个单词。
- 必须是递归的。
- 这里我是怎么做到的。第一个函数改变第一个字母。第二个函数将小写字母放在其余部分。
这是我尝试过的:
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);
}