7-32
7-32 說反話-加強版(20 分)
給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。
輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。
輸出格式:
每個測試用例的輸出占一行,輸出倒序后的句子,並且保證單詞間只有1個空格。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello
#include<stdio.h>//標准c,沒有用c++的string,這樣首先讀取字符串就是個問題了
#define MAX 500000
//先處理字符串,刪除多余的空格,形成新字符串
//Hello World Here I Come
int main ()
{
char s;//指單獨一個字符
char t[MAX];//創建一個字符數組
int i = 0, count = 0, flag = 0;
while ((s=getchar()) != '\n') {//getchar每次從標准輸入讀入一個字符 ,標准輸入會有'\n'???
if (s != ' ') {
flag = 1; //標記遇到單詞
t[i++] = s;
count = 0;
} else if (count > 0) {
continue;//contiue跳過
} else if (flag) {
t[i++] = s; //只有之前遇到單詞的情況下碰到空格才把這個空格寫入目標字符串
count ++;//這里換成count=1也是完全一樣
}
} //刪除多余的空格,將目標字符串放入 t 中
//這里的count起了什么作用呢?
//如遇到 Hello,都存入t中,遇到第一個空格,此時count=0,flag=1,把空格存入t,count=1
//World后面的空格 ,第二個空格,遇到空格繼續讀下一個字符即,continue,起一個跳過作用
//開頭就是空格咋辦?啥也不操作
count = 0;
int j;
for (i-=1; i>=0; i--) {//i-=1.i=i-1,最后一個標號為i里面是沒存東西的
if (t[i] != ' ') {
count ++; // 這里的 count 統計的是一個單詞里字母的個數
} else if (t[i]==' ' && count > 0) {
for (j=i+1; j<=i+count; j++) {
printf("%c", t[j]);
} //遇到空格就輸出單詞
printf(" ");
count = 0;
}
} // 還剩最后一個單詞沒輸出,因為最后一個單詞可能前方無空格 ,只完成了count++,但是沒有遇到 空格,那么邏輯是一樣的
for (j=i+1; j<=i+count; j++) {
printf("%c", t[j]);
} //i,j的變量作用范圍非常的有用
//這么看來字符數組其實非常的方便,不必非要使用c++的string類 ,continue用來跳過也是極好的
return 0;
}