如何在C中逐字翻译句子?

#include  int main(void) { int i,j; int wordstart = -1; int wordend = -1; char words[]= "this is a test"; char temp; // Reverse each word for (i = 0; i < strlen(words); ++i) { wordstart = -1; wordend = -1; if(words[i] != ' ') wordstart = i; for (j = wordstart; j < strlen(words); ++j) { if(words[j] == ' ') { wordend = j - 1; break; } } if(wordend == -1) wordend = strlen(words); for (j = wordstart ; j <= (wordend - wordstart) / 2; ++j) { temp = words[j]; words[j] = words[wordend - (j - wordstart)]; words[wordend - (j - wordstart)] = temp; } i = wordend; printf("reversed string is %s:", words); } } 

我试过这种方式,但我得到这个输出:
siht is a test
我的预期输出是:
test a is this

如果有人采用不同的方法来解决时间复杂度非常低或者纠正我,如果这是正确的方法,我将不胜感激。 谢谢

也许这属于代码审查网站而不是?

你的方法对我来说似乎非常有效(除了我只调用strlen(单词)一次并将结果保存在寄存器中)。

两个可能的错误看起来像:

 wordend = strlen(words); 

应该

 wordend = strlen(words)-1; 

 for(j = wordstart ; j <= (wordend - wordstart) / 2 ; ++j) { 

应该

 for(j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) { 

最终代码看起来像(有一些额外的{}):

  #include  int main(int argc,char *argv[]) { int i,j; char words[]= "this is a test"; int L=strlen(words); // Reverse each word for(i = 0; i < L; ++i) { int wordstart = -1; int wordend = -1; if(words[i] != ' ') { wordstart = i; for(j = wordstart; j < L; ++j) { if(words[j] == ' ') { wordend = j - 1; break; } } if(wordend == -1) wordend = L-1; for(j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) { char temp = words[j]; words[j] = words[wordend - (j - wordstart)]; words[wordend - (j - wordstart)] = temp; } i = wordend; } } printf("reversed string is %s:",words); return 0; } 

您可以创建双链表作为基础数据结构。 然后,迭代单词并在找到它们时将它们插入列表中。

当您到达句子的末尾时,只需向后遍历列表并在您浏览时打印单词

我们只需使用适合我们需求的* 1 2D字符arrays!

 #include  int main() { char s[20][20]; int i=0, length=-1; for(i=0;;i++) { scanf("%s",s[i]); length++; if(getchar()=='\n') break; } for(i=length;i>=0;i--) printf("%s ",s[i]); return 0; } 

开始标记最后一个字符的行并继续第一个字符。 保持一个指针锚定在当前单词的基础上,另一个指针在未找到单词开始时减少。 当您在扫描时发现单词开始时,从单词开始指针打印到单词结束锚点。 将单词结束锚更新为当前单词start char的前一个字符。

您可能希望在扫描时跳过空白字符。

UPDATE

这是一个快速实现:

 #include  #include  #include  #define MAX_BUF 256 void show_string (char *str, int i, int n) { while (i <= n) { printf ("%c", str[i]); i++; } } int main (void) { char str[MAX_BUF]; int end_anchor, start_ptr; int state; printf ("\nEnter a string: "); scanf (" %[^\n]", str); start_ptr = strlen (str) - 1; end_anchor = start_ptr; state = 0; while (start_ptr >= -1) { switch (state) { case 0: if ((!isspace (str[start_ptr]) && (start_ptr >= 0))) { start_ptr--; } else { state = 1; } break; case 1: show_string (str, start_ptr + 1, end_anchor); state = 2; start_ptr--; printf (" "); break; case 2: if (!isspace (str[start_ptr])) { state = 0; end_anchor = start_ptr; } else { start_ptr--; } break; } } printf ("\n"); return 0; } 

end_anchor指向每个结束单词, start_ptr查找end_anchor持有结尾的单词的end_anchor 。 当我们找到一个单词start(通过blankspace字符或start_ptr = -1)时,我们打印从start_ptr + 1end_anchor所有字符。 + 1是因为实现: start_ptr指向空白字符,打印例程将打印从in所有字符。 一旦我们检测到一个空白区域,我们将其打印出来并跳过相邻的空白区域(在case 2 ),并且只保留一个手动打印的空白区域。 一旦检测到非空白空间,我们就有另一个单词结束,为此我们将end_anchor设置为case 2中的该索引,并设置state = 0 ,以便我们可以再次搜索单词start。

 if(words[i] != ' ') wordstart = i; 

这个陈述与其他部分有什么关系? 如果单词[i] ==”,则wordstart保持为-1。 所以也许尝试使用:

 while (words[i] && words[i] == ' ') ++i; if (!words[i]) break; wordstart = i; 

然后你应该从i循环中输出结果。 最后,如果你想得到你期望的结果,你应该再用你在循环中使用的方式反转整个句子。

我会使用类似于strrchr的 write函数来查找' '最后一次出现,如果找到后面的打印字,则用'\0'重写这个' ' '\0'并在循环中重复它直到找不到更多的单词。 最后我会再次打印这个字符串的内容,因为在第一个单词之前很可能没有' '

我会编写自己的函数而不是strrchr,因为strrchr计算给定字符串的长度,在这种情况下这是多余的。 此长度不必多次计算。

这是代码:

 char* findLastWord(char* str, int* len) { int i; for (i = *len - 1; i >= 0; --i) { if (str[i] == ' ') { str[i] = '\0'; if (i < *len - 1) { *len = i - 1; return &str[i + 1]; } } } return NULL; } int main (int argc, char *argv[]) { char str[] = " one two three four five six "; int len = strlen(str); char* lastWord = findLastWord(str, &len); while (lastWord != NULL) { printf("%s\n", lastWord); lastWord = findLastWord(str, &len); } if (len > 1) printf("%s\n", str); return 0; } 

输出:

 six five four three two one 

希望这可以帮助 ;)

 #include #include void reverse(char *str, size_t len) { char tmp; size_t beg, end; if (len <=1) return; for (beg=0,end=len; beg < --end ; beg++) { tmp = str[beg]; str[beg] = str[end]; str[end] = tmp; } } int main(void) { char sentence[] = "one two three four five"; size_t pos, len; printf("Before:%s\n",sentence); for (pos = len= 0; sentence[pos]; pos += len) { pos += strspn( sentence+pos, " \t\n" ); len = strcspn( sentence+pos, " \t\n" ); reverse ( sentence + pos, len ); } reverse ( sentence , pos ); printf("After:%s\n",sentence); return 0; } 
  #include  #include  using namespace std; char* stringrev(char s[], int len) { char *s1 = (char*)malloc(len+1); int i=0; while (len>0) { s1[i++] = s[--len]; } s1[i++] = '\0'; return s1; } void sentrev(char s[], int len) { int i=0; int j=0; char *r = (char*)malloc(len+1); while(1) { if(s[j] == ' ' || s[j] == '\0') { r = stringrev(s+i, ji); i = j+1; cout< 

上面的代码使用char * r和打印cout <来反转句子

 #include #include #include int main() { char st[50], rst[50]; printf("Enter the sentence...\n"); gets(st); int len=strlen(st), p; int j=-1,k; p=len; for(int i=(len-1); i>=0; i--) { //searching for space or beginning if(st[i]==' ') { //reversing and storing each word except the first word for(k=i+1;k 

使用main for循环遍历到句子的结尾:复制字符串中的字母,直到找到空格。 现在调用add@beginning函数并在该函数中每次将字符串传递给链表时添加字符串。 打印链表的内容,中间有一个空格以获得预期的输出

我的代码,只是从最后一个遍历,如果你发现空格打印前面的字符,现在将结束更改为空格-1;这将打印到第二个单词,最后只使用单个for循环打印第一个单词。改变方法。

程序:

 #include int main() { char str[200]; int i,j,k; scanf("%[^\n]s",&str); for(i=0;str[i]!='\0';i++); i=i-1; for(j=i;j>=0;j--) { if((str[j])==' ') { for(k=j+1;k<=i;k++) { printf("%c",str[k]); } i=j-1; printf(" "); } } for(k=0;k<=i;k++) { printf("%c",str[k]); } } 
 using stack #include  #include  #include  int main() { std::stack st; char *words= "this is a test"; char * temp = (char *)calloc(1, sizeof(*temp)); int size1= strlen(words); int k2=0; int k3=0; for(int i=0;i<=size1;i++) { temp[k2] = words[i]; k2++; if(words[i] == ' ') { k3++; if(k3==1) temp[k2-1]='\0'; temp[k2]='\0'; st.push(temp); k2=0; } if(words[i] == '\0') { temp[k2]='\0'; st.push(temp); k2=0; break; } } while (!st.empty()) { printf("%s",st.top().c_str()); st.pop(); }