0

入力した5つの文字列を小さいものから大きいものに並べ替えることができるプログラムを作成しました。ただし、動作しません。私はそれでほぼ1時間働きました、しかし私は問題を見つけることができませんでした。これがコードです。

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

    main() {
    char *sz[5], *temp;
    int i, j;
    for(i = 0; i < 5; i++) {
        gets(sz[i]);
        fflush(stdin);
    }
    for(i = 0; i < 5; i++) {
        for(j = i+1; j < 5; j++) {
            if(strcmp(sz[i], sz[j]) > 0) {
                temp = sz[i];
                sz[i] = sz[j];
                sz[j] = temp;
            }
        }
        puts(sz[i]);
        puts("");
        }
    }
4

3 に答える 3

4

最初の大きな問題は、存在してはならないルーチンを使用していて、それを不適切に使用していることです。

char *sz[5], *temp;
int i, j;
for(i = 0; i < 5; i++) {
    gets(sz[i]);

保存するストレージを割り当てていないgets()ため、関係のないメモリにスクライブしているだけです。(これはしばしばセキュリティ問題につながります。)

BUGSマンページのセクションに特別な注意を払う必要があります。

BUGS
   Never use gets().  Because it is impossible to tell without
   knowing the data in advance how many characters gets() will
   read, and because gets() will continue to store characters
   past the end of the buffer, it is extremely dangerous to use.
   It has been used to break computer security.  Use fgets()
   instead.

gets(3)今、学びを解き、より幸せなプログラマーになりましょう。

malloc()これらの文字配列にメモリを割り当てるために使用します。

Ignacioは、別の問題に真っ向からぶつかりました。並べ替えが完了する前に印刷しているのです。並べ替え後に、印刷する別のループを追加します。(さらに良いことに、入力、並べ替え、出力を3つの別々の関数に入れます。まだそこにいないかもしれませんが、プログラムのテストが印刷関数を使用するのが非常に簡単になるため、後で行うよりも早く行う価値があります。デバッグに使用できます。)

于 2012-06-12T07:39:40.443 に答える
3
char *sz[5], *temp;
int i, j;
for(i = 0; i < 5; i++) {
    gets(sz[i]); /* Tries to write data to random location. */
    fflush(stdin);
}

少なくとも3つの問題:

  • 初期化されていないポインタに書き込んでいます。使用する前に初期化する必要がありますsz[i](おそらくを使用してmalloc
  • fflush(stdin)未定義動作です、ドロップしてください
  • gets安全ではなく、標準から削除されました。同様に削除して、fgets代わりに使用してください
于 2012-06-12T07:37:45.113 に答える
2

初期化されていないポインタをに渡しgets、データをランダムな場所に格納します。これは未定義の動作です。データにメモリを割り当て、fgets文字列を読み取るために制限付きで使用する必要があります。

char *sz[5], *temp;
int i, j;
char buf[100];
for(i = 0; i < 5; i++) {
    fgets (buf , 100 , stdin);
    sz[i] = strdup(buf);
}
... sort your strings...
// Free the strings before exiting the program
for (i = 0 ; i < 5 ; i++) free(sz[i]);
于 2012-06-12T07:38:06.933 に答える