2016-03-29 16 views
-6

Yayınlamadan önce, problemimi düzeltmek için C'den bahsettiğim her şeyi denedim ve işe yaramadı (yani: ffile yerine & sscanf ekleme, getchar() öğesinin eklenmesi (iyi bir uygulama değil), vs., ancak hiçbir şey işe yaramadı.C-Programı - Son programa fazladan giriş alma

Bu küçük örnek, daha büyük bir proje için üzerinde çalıştığım bir kod bölümüdür (normalde küçük bir bölüm yazdım) sorun giderme daha kolay) ve programın çalıştırılması (ve çıkması) için iki kez tekil kullanıcı girişine bir cevap girme zorunluluğum var.İlk cevap olarak ikinci rakamın ne olduğu önemli değil dosyaya değer biçilen ve yazılan (örneğin, '2' giriyorum ve sonra bir komut istemi tekrar görüntülenir, bu yüzden '4' giriyorum, ama sadece sonuç için çıkış dosyasına '2' doğru girişi girilir). Tüm program harika çalışıyor, çünkü programın çalışması için bir değer daha girmem gerekiyor (ve bu şekilde bitiyor). Bir alan onu almaz ve sadece girme işlemi onu almaz (bu ikinci sayı girişini alana kadar sormaya devam eder). Programı sonlandırmak için bir değer girmelisiniz. Neden olduğunu gören kimse var mı (kod)? (FWIW, kod düzgün bir şekilde çalışıyor ve doğru değer veriliyor ve programımın daha büyük amaca hizmet ediyor - eğer talepte bu 'ekstra değeri' durdurabilirsem).

İlginçtir, son 'return (0)' ı programdan kaldırırsam, x için girilen LAST değerini (aldığım iki iletiden) alır ve bu sonucu çıktı dosyasına kaydetmez. ilk komut istemi değeri. Onu bırakın ve ilkini saklayacaktır.

Daha önce hiç bu problemi yaşamamıştım, ve neden programın çalıştırılması (ve sonlandırılması) istemine karşı bana iki yanıt aldığına dair kafa-kuyrukları yapamıyorum.

Açıkçası bunun için kör olduğum bir şey gören var mı? (Bu C, Linux üzerinde derlenmiş ve göze çarpan 'çift istemi sorunu dışında çalışmak için test edilmiştir.)

Teşekkürler.

#include <stdio.h> 
#include <stdlib.h> 

int main() 

{ 

    FILE *encfile; 
    int x; 
    char val001[]="AAAA"; 
    char val002[]="AAAB"; 
    char val003[]="AAAC"; 
    char val004[]="AAAD"; 

    encfile = fopen("encoded.enx","w"); 
         //opens output file "encfile" in write mode 

    printf ("Enter a value from 1 - 4: \n"); 
         //prompts for user choice 
    scanf ("%i\n",&x); 
         //takes value of 1-4 prompt from user 

    if (x == 1) 
         //if input is '1', 

    { 
     fprintf(encfile,"%s\n", val001); 
         //prints val001 to file 'encfile' 
     return (0); 

    } 

    if (x == 2) 
         //if input is '2', 

    { 
     fprintf(encfile,"%s\n", val002); 
         //prints val002 to file 'encfile' 
     return (0); 

    } 

    if (x == 3) 
         //if input is '3', 

    { 
     fprintf(encfile,"%s\n", val003); 
         //prints val003 to file 'encfile' 
     return (0); 

    } 

    if (x == 4) 
         //if input is '4', 

    { 
     fprintf(encfile,"%s\n", val004); 
         //prints val004 to file 'encfile' 
     return (0); 

    } 

    else 
    if ((x << 1) || (x >> 4)) 
         //if input selection is out of range, 

    { 
     printf("You have chosen an invalid number\n"); 
        //prints 'out of range' message 
     return (0); 
    } 

    fclose (encfile); 
        //write file closed 

    return (0);            

} 
+1

Her şeyden önce <<, bir çift kaymalı operatördür. 'X << 1' yerine x <1 'kullanmalısınız. – sikerbela

cevap

3

böyle, scanf '\ n' kaldırmayı deneyin:

:

scanf ("%i",&x); 

bir scanf '\ n' kullanımıyla ilgili ek bilgi için bu tartışmanın bir göz atın Using “\n” in scanf() in C

+0

MÜKEMMEL !!! Ben yoruldum ve o scanf'e '\ n' koyup, farkına bile varmadım. Anladığım kadarıyla, gözden kaçırdığım süper basit sorun (ve şu anda kodlayan komşum şu anda şehir dışındadır, yoksa önce bir telefon görüşmesi yapardım). – Skeetersaurus

+0

Gerekirse, cevabı kabul etmelisiniz. – lukaivicev

İlgili konular