scanf hang setelah penugasan array0.o?

Saya menjalankan kode ini dan meminta masukan pengguna dan kemudian hang ketika mulai memasukkan semua angka itu ke posisi array, saya melakukan beberapa tes di sini untuk membantu saya mencari tahu apa yang menyebabkan hang. Saya tidak dapat memahaminya. Entah itu sesuatu yang sangat mudah atau akan menjadi sesuatu dengan kompiler saya (Kode::Blok).

    // Chapter 9 Programming Project #1

    #include <stdio.h>

    #define N 10

    void selection_sort(int n, int a[]);

    int main(void)
    {
        int i, a[N];

        printf("Enter a series of integers: ");
        for (i = 0; i < N; i++) {
            scanf("%d", &a[i]);
            printf("Scanf Test #%d and %d\n", i, a[i]);
        }

        printf("Scanf Test\n");
        selection_sort(N - 1, a);

        // iterate through array
        for (i = 0; i < N; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");

        return 0;
    }

    void selection_sort(int n, int a[n])
    {
        // Search for the highest value
        // Place that value at the end
        // Call the function with the end of the array removed
        // Create a way for it to break the cycle
        int i, temp, high = n;
        printf("Function Called\n");
        for (i = 0; i < n; i++) {
            printf("Test: %d", i);
            if (a[i] > a[high]) {
                temp = a[high];
                a[high] = a[i];
                a[i] = temp;
                printf("Test Pass: %d\n", i);
                if (n - 1 > 1)
                    selection_sort(n - 1, a);
            }
        }
    }

Catatan::Program ini mencetak Scanf Test #0 and 1 berulang-ulang hingga nomor terakhir ditetapkan ke posisinya di a[i]....di mana #0 and 1, 1 akan menjadi nomor pertama yang dimasukkan pengguna

Edit: Untuk menghilangkan kebingungan, jika pengguna hanya memasukkan 1 angka menjadi "1", maka program akan menetapkan nilai tersebut dan/atau semua nilai lain yang dimasukkan dan ini dapat diverifikasi dengan "Scanf Test" yang saya masukkan, yang akan cetak posisi dalam array diikuti dengan nomor yang ditetapkan padanya. Setelah semua nilai telah ditetapkan ke array, secara teori array harus menjalankan pengujian berikutnya yang berada tepat di bawah loop for. Soalnya tidak, program malah hang setelah mencetak posisi dan nomor terakhir yang ditugaskan....

Program ini tidak melakukan apa pun kecuali hanya duduk di sana, satu orang di bawah menyatakan dia menjalankan kode ini dan berfungsi dengan baik...yang membuat saya percaya ini adalah masalah kompilasi di IDU saya (Kode::Blok)


person John Conner    schedule 16.04.2014    source sumber
comment
Lalu apa yang terjadi setelah #0 dan 1 berulang-ulang?   -  person M.M    schedule 16.04.2014
comment
Izinkan saya mengatakan bahwa kode ini sepertinya berfungsi untuk saya (Apple LLVM 5.1). Ia meminta saya 10 bilangan bulat dan mencetak beberapa barang dan pada akhirnya mencetak 10 bilangan bulat dalam urutan yang meningkat.   -  person carlosdc    schedule 16.04.2014
comment
Bukankah seharusnya if (n - 1 > 1) diubah menjadi if (n - 1 >= 1)?   -  person Mohit Jain    schedule 16.04.2014
comment
maaf saya pingsan setelah memposting ini, hanya hang, tidak pernah sampai ke tes setelah loop for itu   -  person John Conner    schedule 17.04.2014
comment
terima kasih carlosdc, saya pikir ini ada hubungannya dengan kompiler saya...mengingat kode yang sama persis bekerja di semua program lain yang memberikan input ke array dengan cara yang sama.   -  person John Conner    schedule 17.04.2014
comment
Oh dan omong-omong, sedikit keluar dari topik tapi bagaimana cara mengubah nama saya dari user3404748? XD   -  person John Conner    schedule 17.04.2014
comment
Oh dan Mohit Jain, itu adalah editan yang saya lakukan sebelum menambahkan tes, karena awalnya saya mengira fungsi saya menyebabkan loop tak terbatas, jadi saya menambahkannya untuk memastikan seleksi tidak dijalankan setelah sampai pada titik di mana hanya satu karakter yang tersisa. Saya menggunakan pendekatan yang akan terus mempersempit iterasi, hanya melalui nilai-nilai yang belum diurutkan.   -  person John Conner    schedule 17.04.2014


Jawaban (2)


Program ini mencetak "Scanf Test #0 dan 1" berulang kali

Ini akibat tidak mengecek hasil scanf. Jika scanf tidak dapat membaca bilangan bulat, maka alirannya tidak tersentuh dan melaporkan kegagalan. Anda tidak memeriksanya, jadi berhasil sekali dan gagal 9 kali.

Jika Anda memasukkan 10 bilangan bulat itu akan berfungsi dengan baik; namun jelas Anda memasukkan beberapa hal lain seperti huruf yang menyebabkan ekstraksi bilangan bulat gagal.

Jika ada spesifikasi konversi tunggal ("%d") dalam string format, scanf dapat mengembalikan:

  • 1 - sukses
  • 0 - karakter sampah dimasukkan
  • EOF - kesalahan aliran

Anda harus memeriksa nilai ini dan mengambil tindakan yang sesuai. Anda dapat membatalkan program jika bukan 1, meskipun akan lebih baik jika Anda menghapus sampah dan bertanya lagi jika 0.

Pindah ke jenis sebenarnya. Antarmuka Anda aneh saat Anda meneruskan N-1 ke fungsi tersebut, dan kemudian fungsi tersebut mengakses 1 item di luar akhir array. Akan lebih jelas untuk melakukan selection_sort(N, a), dan kemudian di dalam fungsi, high = n-1 dan for (i = 0; i < n-1; i++) dll.

Sekarang, ada masalah halus pada baris tersebut:

void selection_sort(int n, int a[n])

Baris ini tidak cocok dengan prototipe; Anda dapat memperbaiki masalah Anda dengan mengganti saluran dengan:

void selection_sort(int n, int a[])

Versi asli menyebabkan program berperilaku tidak terduga bagi saya, tetapi hanya jika saya memanggil gcc dalam mode default (yaitu tidak memenuhi standar C). Pasti ada semacam ekstensi GNU yang menyebabkan masalah dengan int a[n].

Dalam Standar C, kode asli seharusnya berfungsi (dan berfungsi, jika gcc dipanggil dalam mode standar melalui -std=c99, yang merupakan sesuatu yang sangat saya sarankan untuk dilakukan).

person M.M    schedule 16.04.2014
comment
Terima kasih, saya tidak dapat mengingat kode std=c99 itu setelah saya mengatur ulang pengaturan kompiler saya ke default (Menganggap itu adalah masalah kompiler), saya belum selesai dengan kode saya dan saya menghargai koreksi lainnya. Saya tidak berpikir untuk menambahkan tanda centang ke sana, saya kira terlintas dalam pikiran saya bahwa saya sebenarnya menempatkan 10 posisi ke dalam array dan tanpa menambahkan pencegahan untuk limpasan....Saya tidak ingat memiliki masalah dengan a limpasan menggunakan metode itu sebelumnya tetapi itu praktik yang bagus kan? - person John Conner; 17.04.2014
comment
Sebagai catatan dari void choice_sort(int n, int a[n])...Saya pikir standar C99 memungkinkan Anda menentukan ukuran array dengan cara ini selama Anda mendeklarasikan variabel ukuran sebelum menggunakannya. Saya percaya bahwa ini lebih untuk tampilan daripada apa pun, tetapi hanya digunakan untuk membantu orang lain yang melihat atau mengedit kode. Saya masih cukup baru di C, jadi perbaiki saya jika saya salah. Terima kasih semuanya atas masukannya, sangat dihargai :) - person John Conner; 17.04.2014
comment
Itu memang memungkinkan hal itu. Kode ini berfungsi di C99, tetapi tidak berfungsi di mode GNU non-C99. (BTW dalam hal ini bukan VLA, array hanya dilewatkan seperti array lainnya). Definisi fungsi harus sesuai dengan prototipe. - person M.M; 17.04.2014
comment
Terima kasih Matt dan Jonathan, itu masalah saya, program tidak memiliki pemeriksaan itu dan hanya menerima 10 nilai sekaligus, satu hal yang saya tidak terpikir untuk memeriksa XD - person John Conner; 17.04.2014

Saya tahu cara saya melakukan ini agak tidak lazim, tetapi saya hanya dapat menggunakan apa yang telah saya pelajari sejauh ini. Melakukannya dengan cara ini memungkinkan pengguna untuk memasukkan sejumlah bilangan bulat, satu atau dua digit angka, dan tidak perlu khawatir memasukkan sejumlah nilai tertentu... Silakan mengkritik dan menambah atau memperbaiki metode saya.

Terima kasih telah membantu saya dalam hal ini.

    // Chapter 9 Programming Project #1

    #include <stdio.h>
    #include <ctype.h>

    #define N count

    void selection_sort(int n, int a[]);

    int main(void)
    {
        int i, temp, temp2, a[20], count_dgts = 0, count = 0;
        char ch;

        printf("Enter a series of integers\n");
        printf("Enter only one or two digit numbers: ");
        ch = getchar();
        for (i = 0; ch != '\n';) {
            switch (ch) {
                case '0': temp = 0; count_dgts += 1; break;
                case '1': temp = 1; count_dgts += 1; break;
                case '2': temp = 2; count_dgts += 1; break;
                case '3': temp = 3; count_dgts += 1; break;
                case '4': temp = 4; count_dgts += 1; break;
                case '5': temp = 5; count_dgts += 1; break;
                case '6': temp = 6; count_dgts += 1; break;
                case '7': temp = 7; count_dgts += 1; break;
                case '8': temp = 8; count_dgts += 1; break;
                case '9': temp = 9; count_dgts += 1; break;
                default: count_dgts = 0; break;
            }
            ch = getchar();
            if (count_dgts == 2) {
                a[i++] = (temp2 * 10) + temp;
                count += 1;
            }
            if (ch != ' ' && count_dgts == 1) {
                temp2 = temp;
            }
            if ((ch == ' ' && count_dgts == 1) ||
                (ch == '\n' && count_dgts == 1)) {
                a[i++] = temp;
                count += 1;
            }
        }
        selection_sort(N, a);
        // iterate through array
        printf("\nYour numbers in ascending order are: \n");
        for (i = 0; i < N; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
        return 0;
    }

    void selection_sort(int n, int a[])
    {
        // Search for the highest value
        // Place that value at the end
        // Call the function with the end of the array removed
        // Create a way for it to break the cycle
        int i, temp, high = n - 1;
        for (i = 0; i < n; i++) {
            if (a[i] > a[high]) {
                temp = a[high];
                a[high] = a[i];
                a[i] = temp;
                if (n - 1 > 1)
                    selection_sort(n - 1, a);
            }
        }
    }
person Community    schedule 17.04.2014
comment
Dan ya, saya baru menyadari bahwa menambahkan ctypes.h, tidak ada gunanya...Saya pikir saya akan menggunakannya, tetapi akhirnya tidak membutuhkannya...Saya bekerja dengan angka bukan huruf, jadi..... - person John Conner; 17.04.2014