替换每个单词的第一个元音/遍历char*string/在string[c]中添加每个单词



我的目标是将句子中每个单词的第一个元音改为"i",并将声母簇(如果有(移到单词的末尾并添加ee。

例如:

  • 字符串=";花黄色">
  • 翻译字符串=";我逃离了依

到目前为止,我拥有的代码rn能够将原始字符串拆分为单词,这样strchr函数就可以找到每个单词中的元音,并将其替换为"i"。但是被替换的元音并不是第一个元音。相反,它只遵循元音数组中列出的元音的顺序。

  • 字符串:花黄色
  • 翻译字符串:flowir yillow

应该更灵活。

void englishToMatte(char englishSentence[], char matteSentence[])
{
char** word = splitIntoWords(englishSentence);
char *p;
int vowels[] = {'a', 'e', 'i', 'o', 'u'};
int i;
char** it;
char dest[100];
for(it=word; it && *it; ++it){
for(i = 0; i < 5; i++){
if((p = strchr(*it, vowels[i])) != NULL){
*p = 'i';
break;
}
}
strcat(dest, *it);
strcat(dest, " ");
free(*it);
}
/*puts(dest);*/ /*for debugging*/
strcpy(matteSentence, dest); 
free(word);
}

我认为我应该从头到尾迭代*it字符串,或者将if条件替换为switch条件,但我不知道如何在switch参数中包含strchr。我知道这个问题肯定已经有了答案,但到目前为止,我只找到了太具体的答案:如何在字符**变量中迭代

或c程序,其给出相同的不期望的结果:https://quescol.com/interview-preparation/replace-first-vowel-program-in-c

我知道这是一个很容易解决的问题,但我绝对是个笨蛋。

这应该是您想要的。无法确定是否插入了hypen。

对单词进行计数,为结果分配空间,根据第一个元音的位置(如果存在于"单词"中(处理每个单词,构建输出结果。注意:这将不考虑在原文中分隔单词的多个空格。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *smpl = "Quick brown foxes jump over flower yellow & Unicorns";
char *wordSep = " ";
int main() {
int len = strlen( smpl );
printf( "Orginal string: '%s' (%d chars)n", smpl, len );

// Count the words in the "sentence"
char *pBuf = strdup( smpl );
int nWord = 0;
for( char *cp = pBuf; (cp = strtok( cp, wordSep ) ) != NULL; cp = NULL )
nWord++;
printf( "%d "words"n", nWord );
strcpy( pBuf, smpl); // reload
// create output buffer large enough for expansion.
char *oBuf = (char*)calloc( len + nWord*4 + 1, sizeof(char) );
// calloc NEVER returns null pointer
char *at = oBuf;
for( char *pWord = pBuf; (pWord = strtok( pWord, wordSep ) ) != NULL; pWord = NULL ) {
char *init = pWord; // beginning of word
char *vwl1 = strpbrk( init, "AEIOUaeiou" ); // first vowel of word
if( vwl1 == NULL ) { // all consonants!
at += sprintf( at, "%s ", init );
continue;
}
if( vwl1 == init ) { // eg: "Unicorn"
*at++ = "iI"[ isupper( *vwl1 ) ]; // 'i' matching the case
at += sprintf( at, "%s-ee ", init + 1 );
continue;
}
*at++ = "iI"[ isupper( *vwl1 ) ]; // 'i' matching the case
*vwl1 = '';
at += sprintf( at, "%s-%see ", vwl1 + 1, init );
}
puts( oBuf );
free( oBuf );
free( pBuf );
return 0;
}

输出:

Orginal string: 'Quick brown foxes jump over flower yellow & Unicorns' (52 chars)
9 "words"
iick-Qee iwn-bree ixes-fee imp-jee iver-ee iwer-flee illow-yee & Inicorns-ee

作为练习,找出如何使"i"与句子开头大写"Q"的大小写匹配(并使重新定位的"Q"小写…(

如果读到这篇文章的人也有同样的问题,下面是代码的一部分(非常感谢gerhardh(

dest[100] = " "; //initialize string
//see main post above for unmentioned variables 
for(it=word; it && *it; ++it){
myString=*it;
for(int i=0; myString[i]!=0; i++){
if(myString[i]=='a' ||myString[i]=='e' ||myString[i]=='i' ||myString[i]=='o' ||myString[i]=='u'){
myString[i] = 'i';
break;
}
}
strcat(dest, *it);
strcat(dest, " ");
free(myString);
}

现在剩下的问题是将声母簇附加到单词的末尾。当我找到解决方案时,将对此进行更新。

最新更新