[英]Reverse a string word by word
I am able to reverse a string.我能够反转字符串。 For example, I can reverse "reverse a string" to "esrever a gnirts".例如,我可以将“反转字符串”反转为“esrever a gnirts”。 But I am not able to reverse it word by word like "string a reverse".但我无法像“string a reverse”那样逐字反转它。
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;
}
做你已经做过的事情,然后反转整个结果(不特别处理空格)。
This is the way.这就是方法。 I am able to reverse a string word-wise, as well as the entire string.我能够逐字反转字符串以及整个字符串。 Just go through the code and see if the logic helps.只需浏览代码,看看逻辑是否有帮助。
#include <stdio.h>
#include <string.h>
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, j-i );
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<j; i++, j--)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
void stringrev(char *str)
{
int i=-1,j=0;
char rev[50];
while(str[i++]!='\0');
while(i>=0)
rev[j++] = str[i--];
rev[j]='\0';
printf("\nComplete reverse of the string is : %s\n",rev);
}
Use a stack implementation for this problem针对此问题使用堆栈实现
Step1: Write the string into a file Step1:将字符串写入文件
Step2: Read this from the file and push onto linked list Step2:从文件中读取并推送到链表
Step3: Use stack implementation on this linked list Step3:在这个链表上使用栈实现
Step4: Pop of the linked list starting from head to the end !! Step4:从头到尾弹出链表!!
That reverse's it....!!那个反转是....!!
Reverse words in String using C#使用 C# 反转字符串中的单词
public string ReverseWordsInString(string inputString)
{
string output = string.Empty;
string[] splitStrings = inputString.Split(' ');
for (int i = splitStrings.Length-1; i > -1 ; i--)
{
output = output + splitStrings[i]+ " ";
}
return output;
}
Not very efficient, but should work:效率不高,但应该有效:
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** ),将其反转,然后再次连接。
Here's a Java solution that doesn't use a Scanner or a Stack to parse the words.这是一个不使用 Scanner 或 Stack 来解析单词的 Java 解决方案。 Starts at the end of the String and works backwards.从字符串的末尾开始并向后工作。 Could be more elegant but works - if anyone has a recursive java solution I'd like to see it.可能更优雅但有效 - 如果有人有递归 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);
}
}
Read the string from the starting and push each character into a character stack.从头开始读取字符串并将每个字符推入字符堆栈。 Once you encounter space or newline or eof, start popping off characters and print them one by one on standard output or store it in a file as you wish.一旦遇到空格、换行符或 eof,就开始弹出字符并在标准输出上一个一个地打印它们,或者根据需要将其存储在文件中。
'My name is' return as 'yM eman si'
'My name is' return as 'yM eman si'
#include<stdio.h>
#include<malloc.h>
#include<string.h>
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;i--,j++)
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
} }
'i love india' return as 'india love i'
' i love india' return as 'india love i'
#include<stdio.h>
#include<malloc.h>
#include<string.h>
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<i;i--,j++)
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
} }
It shouldn't be as complex as others have posted, please refer this and provide feedback, Happy to improve it.它不应该像其他人发布的那样复杂,请参考并提供反馈,很高兴改进它。
#include <stdio.h>
#include <string.h>
void printWordsInReverse(char str[])
{
int i;
int length = strlen(str);
for(i=length-1; i>=0; i--)
{
if(str[i] == ' ')
{
/* replace the space with null for the next word */
str[i] = '\0';
/* remove the white spaces */
if(str[i+1] != '\0')
{
/* print a word till the null character */
printf("%s ", &str[i+1]);
}
}
}
/* print the last word */
printf("%s", str);
}
int main()
{
char str[] = "reverse a string";
printWordsInReverse(str);
return 0;
}
output : "string a reverse"输出:“字符串反向”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.