2016-04-13 63 views
-1

我是C編程的初學者,我試圖「將字符串拆分爲單獨的單詞並反向寫入字符串」。反轉字順序的錯誤

樣品輸入:Hello World it's FUBAR

樣本輸出:FUBAR it's World Hello

我有這個代碼到目前爲止已經試過它的代碼塊13.12(的Windows 8.1/AMD A8):

#include<stdio.h> 
    #include<string.h> 

    char str[100]; 
    char word[100][100]; 



    int main(){ 
     fgets(str,100,stdin); 
     int i=0,j=0,k=0; 
     for(i=0;i<100;i++){ 
      while(str[i]!=' ' || str[i]!='\0') 
      { 
      word[j][k]=str[i]; 
      i++; 
      j++; 
     } 
     if(str[i]==' '){ 
      k++; 
      } 
     } 
    while(k>0){ 
     for(j=0;j<100;j++){ 
      printf("%s",word[j]); 
      } 
     printf(" "); 
     k--; 
    } 
    return 0; 
    } 

代碼編譯有0個錯誤,0個警告。

但是當我構建並運行代碼時,它會崩潰並顯示錯誤消息-1073741510。 我已經嘗試了好幾個小時了,但一直未能弄清楚代碼在哪裏破壞。請幫我解決這個問題。

+1

難道代碼塊沒有一個集成的調試? –

+0

使用您的調試器來斷點/執行代碼。 Simples。 –

+0

如果您使用簡單的條目(如「01245」),那麼它會很有用,因爲該字符還會告訴您它來自哪個索引。 –

回答

0

請嘗試此代碼。
1)消除額外的循環。
2)交換j和k變量。每一行都會構成一個新詞。
3)word [0] [1..100]將第一個單詞和單詞[1] [1..100]作爲第二個單詞。

int main(){ 
    fgets(str,100,stdin); 
    printf("str is [%s]\n",str); 
    int i=0,j=0,k=0; 
    for(i=0;i<100;i++){ 
     printf("char is [%c]\n",str[i]); 
     if( str[i]!=' ' && str[i]!='\0') 
     { 
      word[j][k]=str[i]; 
      k++; 
     }else if(isspace(str[i]) || str[i] == ' '){ 
      printf("space found\n"); 
      j++; 
     } 
    } 
    printf("value of j [%d]\n",j); 
    while(j>=0){ 
     for(k=0;k<100;k++){ 
      printf("%c",word[j][k]); 
     } 
     printf(" "); 
     j--; 
    } 
    return 0; 
} 
+0

我試着用ideone這個代碼,它運作良好([鏈接] http://ideone.com/lmbe8f)。但是,當我用CodeBlocks嘗試它時,我得到了大量填充的輸出(Screenshot here:[link] http://i.imgur.com/AvbqnrT.jpg)。我該如何處理這件事? –

+0

輸出中顯示新行。將第7行更改爲if(str [i]!=''&& str [i]!='\ 0'&& str [i]!='\ n') –

0

for循環如下錯了,應該是

for(i=0;i<100;i++) 
{ 
    while(str[i]!=' ' || str[i]!='\0') 
    { 
     word[j][k]=str[i]; 
     i++; 
     k++; 
    } 
    if(str[i]==' ') 
    { 
     j++; 
    } 
} 

通知的kj增量交換。

0

第一次增加k而不是j。 In if(str [i] =='')爲word [j] [k]設置空終止符,然後增加j而不是k。

0

下面是一個更正後的代碼。請注意,輸出不是完全在一行中。例如,輸出將總是像這樣,

編輯:感謝雷克薩斯在評論中提醒的一點。我能夠緩解這個問題有點

變化代碼所做的:

更改下面的代碼行

for(i=0;i<strlen(str);i++) 

for(i=0;i<strlen(str)-1;i++) 

雖然,在輸出同一行中所有單詞的問題已解決,但還有另一個單詞問題。現在第一個和第二個詞之間沒有空格。

因此,新的問題是,

實施例1:

Input: Welcome to Bravo 
Output: Bravoto Welcome 

實施例2:

Input: Hello World it's FUBAR 
Output: FUBARit's World Hello 

暫時解決上述問題是改變該代碼

for(m=j;m>=0;m--){ 
     printf("%s",word[m]); 
    } 

向該代碼,

for(m=j;m>=0;m--){ 
    if(m == j){ 
     printf("%s ",word[m]); 
    } 
    else{ 
     printf("%s",word[m]); 
    } 
} 

(我想的發生是由於從一維陣列的二維陣列映射這個問題,並有可能是參與一些填充。) - >編輯:這不是由於填充但,「我想這個問題是由於...」 - 不,它是由於fgets,它也存儲了終止的換行代碼 - Rad Lexus。

不管怎麼說,這裏是代碼,

#include<stdio.h> 
#include<string.h> 

char str[100]; 
char word[100][100]; 

int main(){ 

    int i=0,j=0,k=0; 
    int m=0; 

    fgets(str,100,stdin); 

    for(i=0;i<strlen(str)-1;i++){ 
     if(str[i]!=' '){ 
      word[j][k]=str[i]; 
      //printf("%c",word[j][k]); 
      k++; 
     } 
     if(str[i] == ' ' || str[i] == '\0'){ 
      word[j][k]=' '; 
      k=0; 
      j++; 
     } 
    } 
    for(m=j;m>=0;m--){ 
     printf("%s",word[m]);/*----->TEMPORARY SOLUTION 
             for(m=j;m>=0;m--){ 
             if(m == j){ 
              printf("%s ",word[m]); 
             } 
              else{ 
              printf("%s",word[m]); 
              } 
             }*/ 
} 

return 0; 
} 
+0

「我想這個問題是由於..」 - 不,這是由於'fgets',它也存儲了終止換行符代碼。 – usr2564301

+0

@Rad lexus感謝提醒我忘記了存儲換行代碼的fgets。 – LuckyAli