2016-07-24 7 views
-1

strlen()strrev()機能を使用せずに文字列を逆順にするプログラムです。このコードに関して私を助けてください:lengthの機能は11を示しますが、reverseの機能は機能しません。なぜこの文字列逆プログラムは機能しませんか?

#include <stdio.h> 
#include <conio.h> 

int length(char*); 
char *reverse(char*); 

main() { 
    printf("%d", length("himanshupal")); 
    printf("%s", reverse("himanshupal")); 
    getch(); 
} 

/* used to calculate the lenghth*/ 
int length(char *p) { 
    int l; 

    for (l = 0; *(p+l) != '\0'; l++); 
    return (l); 
} 

char *reverse(char *p) { // function for reversing the string 
          // l used for length 
    int i, l; 
    char t; 

    for (l = 0; *(p+l) != '\0'; l++); 
    for (i = 0; i < l/2; i++) { 
     t = *(p+i); 
     *(p+i) = *(p+l-1-i); 
     *(p+l-1-i) = t; 
    } 
    return (p); 
} 
+0

のような機能長を宣言するために優れていることを考慮してください?ビルドエラーが出ますか?その後、あなたが得る正確なエラーを投稿してください。あなたはクラッシュしますか?その後、デバッガを実行してデバッガの発生場所を特定します。予期しない結果が出ますか?次に、実際の出力と期待される出力を表示してください。また、[良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+2

文字列リテラルの型は 'const char *'です。とにかくあなたのプログラムがコンパイルされるのは、すべてのCプログラマがハード・ウェイを学ばなければならない悲劇です。 –

+0

私はlength.exeでプログラムを保存します。実行中の長さ関数の後に11.が表示されますが、緑色の行がポップアップしていてlength.exeが正しく実行されていないことを示しています –

答えて

1

文字リテラルはCおよびC++では不変です。文字列リテラルを変更しようとすると、未定義の動作になります。:)

代わりに文字配列を使用してください。例えば

int main(void) 
    //^^^^^^^^^^^^^^ 
    { 
     char s[] = "himanshupal"; 
     printf("%d\n", length(s)); 
     printf("%s\n", reverse(s)); 
     getch(); 
    } 

は、あなたがプログラムが動作していないことを言うとき、あなたは何を意味する

size_t length(const char *); 
+0

ありがとう兄弟は働いていますが、私のコードで何が間違っていますか? –

+0

@HimanshuPalあなたはprintf( "%s"、reverse( "himanshupal"))コールで文字列リテラルを使用しています。関数reverseはそれを変更しようとします。 –

+0

どのようにそれは呼び出しを変更しますか? –

関連する問題