逐字反转字符串

我能够反转一个字符串。 例如,我可以将“反向字符串”反转为“esrever a gnirts”。 但是我无法像“字符串反向”那样逐字翻转它。

void reverseString(char string[],char *start, char* end) { char tmp; //temporary variable to swap values int count = 0; while(start<end) { if(*start==' ') { printf("found space count %d \n",count); reverseString(string,start-count,start); } tmp = *start; *start = *end; *end = tmp; *start++; *end--; count++; } printf(" string %s \n", string); } int main() { char string[] = "reverse a string word by word"; char *start =string; char *end =start+ strlen(string) -1; reverseString(string,start,end); return 0; } 

这就是方法。 我能够按字词反转字符串,以及整个字符串。 只需浏览代码,看看逻辑是否有帮助。

 #include  #include  void stringrev(char *); void reverseWords(char *); void reverseString(char* , int); int main() { char string[] = "reverse a string word by word"; reverseWords(string); printf("\nWord-Wise Reversed String : %s\n",string); stringrev(string); return 0; } void reverseWords(char * str) { int i = 0, j = 0; reverseString( str, strlen(str) ); while( 1 ) // Loop forever { if( *(str+j) == ' ' || *(str+j) == '\0') // Found a word or reached the end of sentence { reverseString( str+i, ji ); i = j+1; } if( *(str+j) == '\0') { break; } j++; } } void reverseString(char* str, int len) { int i, j; char temp; i=j=temp=0; j=len-1; for (i=0; i=0) rev[j++] = str[i--]; rev[j]='\0'; printf("\nComplete reverse of the string is : %s\n",rev); } 

做你已经完成的事情,然后反转整个结果(不专门处理空格)。

使用堆栈实现来解决此问题

第1步:将字符串写入文件

第二步:从文件中读取并推送到链表

第3步:在此链接列表上使用堆栈实现

Step4:从头到尾弹出链表!

那反过来了…… !!

效率不高,但应该有效:

 void reverse_string_word(char *data) { char *saveptr; char *word; char *tmp = malloc(strlen(data) + 1); char *tmp2 = malloc(strlen(data) + 1); *tmp = 0; *tmp2 = 0; word = strtok_r(data, " ", &saveptr); if (word) { strcpy(tmp, word); } while (word) { word = strtok_r(NULL, " ", &saveptr); if (word) { sprintf(tmp2, "%s %s", word, tmp); strcpy(tmp, tmp2); } } strcpy(data, tmp); free(tmp); free(tmp2); } 

将它分成一个单词数组(char **),反转它然后再连接它。

这是一个Java解决方案,它不使用扫描程序或堆栈来解析单词。 从String的末尾开始并向后工作。 可能更优雅但有效 – 如果有人有一个递归的java解决方案,我想看到它。

 "one two three four" is returned as "four three two one" private void reverseWordsNoStackNoScanner(String str) { System.out.println("reverseWordsNoStackNoScanner "+str); String[] buff = new String[str.length()]; int end=str.length()-1; int j=end; int start=0; int ptr=0; for (int i=str.length()-1;i>=0;i--){ boolean writeBuff=false; if (str.charAt(i)!=' ') { // have we backed up to a blank? j--; //no } else { //yes! write out this word writeBuff=true; } if (i==0) writeBuff=true; //are we done (position 0)? if (writeBuff) { //time to write a word? //we've hit a delimiter (or we're done) ptr=j; //pointing at a blank or the beginning ptr++; //bump past the blank or the beginning while(ptr<=end){ //write the word from beginning to finish buff[start++]=String.valueOf(str.charAt(ptr++)); } //don't write a blank when we are on the last word (past the end) if (i>0)buff[start++]=" "; j--; //set pointers for next iteration end=j; //back up end ptr to new 'end' - to parse the next word } } //print out our reversed word string for (String s: buff) { System.out.print(s); } } 

从开头读取字符串并将每个字符推入字符堆栈。 一旦遇到空格或换行符或eof,开始弹出字符并在标准输出上逐个打印或根据需要将其存储在文件中。

 'My name is' return as 'yM eman si' 'My name is' return as 'yM eman si' #include #include #include void reve(char [],int,int); void main() { char *a; int i,j=-1; a=(char*)malloc(1000*sizeof(char)); gets(a); for(i=0;a[i]!='\0';i++) { if(a[i]!=' '&&j==-1) j=i; if((a[i]==' '&&a[i+1]!=' '&&j>=0)||a[i+1]=='\0') { a[i]==' '?reve(a,j,i-1):reve(a,j,i); j=-1; } } for(i=0;a[i]!='\0';i++) printf("%c",a[i]); 

}

 void reve(char a[],int j,int i) { char temp; if(a[0]==' ') j=0; for(;i!=j&&j 

}

 'i love india' return as 'india love i' ' i love india' return as 'india love i' #include #include #include void reve(char [],int,int); void main() { char *a; int i,j=-1; a=(char*)malloc(1000*sizeof(char)); gets(a); for(i=0;a[i]!='\0';i++) { if(a[i]!=' '&&j==-1) j=i; if((a[i]==' '&&a[i+1]!=' '&&j>=0)||a[i+1]=='\0') { a[i]==' '?reve(a,j,i-1):reve(a,j,i); j=-1; } } reve(a,0,i-1); for(i=0;a[i]!='\0';i++) printf("%c",a[i]); 

}

 void reve(char a[],int j,int i) { char temp; if(a[0]==' ') j=0; for(;i!=j&&j 

}