輸入一個英文句子,翻轉句子中的單詞,要求單詞內的字元順序不變。 如:I am a student. 轉換成 student. a am I

aFakeProgramer發表於2018-08-06

 

 

輸入一個英文句子,翻轉句子中的單詞,要求單詞內的字元順序不變。

如:I am a student. 轉換成 student. a am I 

 

演算法分析:

1、通過ReverseString(s,0,5)交換字串第0位和第5位的字元,將I am a student. 轉換成a am I student.

2、然後將字元向左移動一位變成 am I student.a

3、順序向左移動7次就成為了student. a am I 

 

#include "iostream"
#include <stdio.h>
using namespace std;

void ReverseString(char *s,int from,int to)
 {
   //交換from和to位置的字元
     if(from<to)
     {
         char t = s[from];
         s[from] = s[to];
         s[to] = t; 
     }
 }
 void LeftShiftOne(char *s,int n)
 {   //字串向左移動一位,最左邊一個字元放到最右邊
     char t=s[0];
     for(int i=1; i<n ;i++)
     {
         s[i-1] = s[i];
     }
     s[n-1]=t;
 }
 void LeftString(char *s,int n,int m)//向左移動m 次
 {
     while(m--)
     {
         LeftShiftOne(s,n);
     }
 
 }

int _tmain(int argc, _TCHAR* sargv[])
{  
    char *s="I am a Student.";//字串常量,不可通過指標修改char arr[]="I am a Student.";
    int n=strlen(s);
    cout<<s<<endl;
    cout<<n<<endl;
    ReverseString(s,0,5);
    cout<<s<<endl;
    LeftString(s,n,7);
    cout<<s<<endl;
    system("pause");
    return 0;
} 

以上程式碼執行到s[from]=s[to]會出現

projectOne.exe 中的 0x0086193f 處最可能的異常: 0xC0000005: 寫入位置 0x00867838 時發生訪問衝突
projectOne.exe 中的 0x0086193f 處有未經處理的異常: 0xC0000005: 寫入位置 0x00867838 時發生訪問衝突
 不知道原因

 

 

 

由於char *s="I am a student.";是一個字串常量,是儲存在static記憶體塊裡,不能通過指標修改

所以需要把它改成:char arr[]="I am a student.";

 

方法二:

先翻轉每個單詞,然後再翻轉整個句子。如先將“I am a student.”反轉為“I ma a .tneduts”,然後再對中間結果“I ma a .tneduts”整體翻轉,即為 “student. a am I”。

#include <stdio.h>
#include <string.h>
//反轉一個單詞[from,to]區間內的字母
void reserveString(char arr[],int from, int to)
{
    while(from < to)
    {
        char tmp = arr[from];
        arr[from]= arr[to];
        arr[to] = tmp;
        from ++;
        to --;
    }

    
}
/*
//這樣寫也可以
 void reverseString(char arr[],int from,int to)
 {
	 for(int i=from;from<to;from++)
	 {
		 char tmp = arr[from];
		 arr[from] = arr[to];
		 arr[to] = tmp; 
		 to--;
	 }
 }
*/

//反轉一句話,以'\0'結尾
void reserve(char ch[], int len)
{
    int i=0;
    int from = 0;
    int to   = 0;
    while(i<=len)//陣列中每個字元都要判定,包括'\0'
    {
        if(ch[to] == ' ' || ch[to]=='\0')
        {
            reserveString(ch, from,to-1);   //先反轉每個單詞,[from,to-1]
            from = ++to;                    //尋找下一個單詞。
        }
        else
        {
            to++;
        }
        i++;
    }
    reserveString(ch, 0,len-1);  //再整體反轉
}

int main()
{
    char arr[]="I am a student.";
	int n=strlen(arr);
	cout<<arr<<n<<endl;
	reverseWord(arr,n);
	cout<<arr<<endl;
	reverseString(arr, 0, n-1);
	cout<<arr<<endl;
	system("pause");
	return 0;
}

 注意reverseString(arr, 0, n-1);//這邊不能寫成n,陣列的下標比實際長度小1

 

 

相關文章