程式的流程設計是這樣的:
- 使用gets收下字串到字元陣列inputString
- 初始化用來儲存輸出字元陣列的outputString,以及記錄outputString目前放到哪個字元的outputIndex
- 注意!這邊的inputString跟outputString建議設到10K,不然會給Runtime Error
- 注意!這邊不需要初始化用來判斷使用哪個引號的flagQuote,用了反而會得到WA...
- 一一比對每個字元,
- 如果不是雙引號,則將該字元直接儲存到outputString,outputIndex加一
- 如果出現雙引號("),則根據flagQuote數值,在outputString中放入左雙引號或右雙引號,outputIndex加二
- 最後使用puts(outputString)印出字串
程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( int argc , char *argv []) {
int i;
int flagQuote = 1;
/* need 100000 to avoid runtime error*/
char inputString[100000];
/* use gets() to get input string, except /n char*/
while(gets(inputString)){
/*initialize the containers*/
int outputIndex = 0;
char outputString [100000] = {};
for (i = 0; i < strlen(inputString); i++){
if (inputString[i] == '"'){
if (flagQuote){
/* meet " first time*/
outputString[outputIndex] = '`';
outputString[outputIndex +1] = '`';
} else{
outputString[outputIndex ] = '\'';
outputString[outputIndex +1] = '\'';
}
flagQuote = (flagQuote == 1)? 0: 1;
outputIndex +=2;
}else{
outputString[outputIndex] = inputString[i];
outputIndex++;
}
}
puts(outputString);
}
return 0;
}
另外在網路上有看到更簡潔的方式!直接將雙引號已左雙引號或右雙引號print出來!原來UVa可以不用擠在一行印出來,Orz
修改後的程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( int argc , char *argv []) {
int i;
int flagQuote = 1;
char inputString[100000];
while(gets(inputString)){
for (i = 0; i < strlen(inputString); i++){
if (inputString[i] == '"'){
if (flagQuote){
printf("``");
} else{
printf("\'\'");
}
flagQuote = (flagQuote == 1)? 0: 1;
}else{
printf("%c", inputString[i]);
}
}
printf("\n");
}
return 0;
}
想挑戰更難的:102 Ecological Bin Packing
Comments
Post a Comment