2016-04-18 9 views
-4

にR.未定義の出力(K&R 1.19)

はcharacteの文字列sを反転させる関数の逆(複数可)を書きます。 はここで一度

をラインにその入力を反転させるプログラムを書くためにそれを使用して、私のコードは、問題は、この Undefined Behavior

のように、私は未定義の出力を持っているということです

#include <stdlib.h> 
#include <stdio.h> 
#define MAX 150 

void reverse(char s[]); 

int main() 
{ 
    int c, i; 
    char string[MAX]; 

    i=0; 
    while((c=getchar())!= EOF){ 
     while((c=getchar()) != '\n'){ 
      string[i] = c; 
      i++; 
     } 
     reverse(string); 
    } 
    return 0; 
} 
void reverse(char s[]){ 
    int i, j; 
    for(i=0; i<MAX-1; i++){ 
     if(s[i] == '\n') 
      break; 
    } 
    for(j=i;j>=0;j--) 
    printf("%c", s[j]); 
    printf("\n"); 

} 

です

私はそれを理解しようとしましたが、私には意味がありません。 ご協力いただきありがとうございます。

+0

が含まれているだけの部分が何をしようとしていますか? – Boiethios

+0

"文字列を反転する逆関数を書く 一度に入力を反転するプログラムを書くときに使用する" – Emanuele

+1

Cの文字列が終端されています...プログラムは常に全長に渡ります文字列の実際の長さを調べることなくバッファの長さを調べます。 – fvu

答えて

1

あなたのコード内のいくつかの問題があります。

最初に、EOFチェックで最初の文字を「飲み込む」。最初に配列に書き込まれるのは、実際には2番目のバッファです(バッファにstring^ it would copyと入力した場合)。

次に、含まれている文字列の長さに関係なく、フルバッファ(150文字)を反転します。あなたが見るゴミはバッファの「残りの部分」だけです。 "ゴミ"の最後の文字はgnirtであり、これはtringであることに注意してください。

また、適切な文字列終了には、\0と注意してください。iがIデインクリメントstringSizeを文字列配列を反復と

while (string[stringSize] != '\0') 
    { 
     stringSize++; 
    } 

    int i = 0; 

その長さを計算するために、whileループを使用

0

はと

while((c=getchar())!= EOF){ 
    while((c=getchar()) != '\n'){ 
     string[i] = c; 
     i++; 
    } 

を交換してみてください:

while(((c=getchar())!= EOF) && (c != '\n')){ 
     string[i] = c; 
     i++; 
     string[i] = '\0' 
    } 
+0

まず、ゼロターミネータが必要です。次に、ネストされたループは必要ありません。 –

1

私は代わりに、これらのループはあなたを示唆している -

while((c=getchar())!= EOF){ 
    while((c=getchar()) != '\n'){ 

はこれを試してみてください -

while((c=getchar()) != '\n' && c!=EOF){ 
関数を呼び出す前に、210

そして、このループの後 -

string[i]='\0'; // append '\0' 

と機能reverseに代わり'\0'ため'\n'チェックをチェックする -

for(i=0; s[i]!='\0'; i++){  //you use it to get length of string 
} 
/* Or better to get length use strlen() from <string.h> */ 
0
#include <stdio.h> 

#define MAX_ARRAY_SIZE 50 

void Reverse(char string[]); 

void Reverse(char string[]) 
{ 
    int stringSize = 0; 

それが終わりにプリントアウトされますときにはNULLが含まれていませんターミネータ文字( '\ 0')GETCHARがEOFまたはCであるか否かを

stringSize -= 1; 

    for (i = stringSize; i >= 0; i--) 
    { 
     printf("%c", string[i]); 
    } 

    printf("\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 
    int c = 0; 

    char string[MAX_ARRAY_SIZE]; 

チェックは、改行文字( '\ n')

あります空行の文字に10の
while ((c = getchar()) != EOF && c != '\n') 
    { 
     string[i] = c; 
     i++; 
    } 

設定文字列[i]は、それが逆に配列全体を印刷しないように文字列

string[i] = '\0'; 

    Reverse(string); 

    return 0; 
} 
関連する問題