Scanf neden sonsuz forlool'e neden oluyor [duplicate]

Sep 23 2020

C'ye yeni başlıyorum ve bunun neden olduğunu bilmiyorum. Programı çalıştırdığımda service_codedizide sadece 1 değer depoladı . Nedense scanf()döngü sayacını i0 olarak tutuyor . Bir çözüm bulamadım. scanf()Sonsuz çalıştırmak için forloop neden oluyor. Bunu nasıl düzelteceğini bilen var mı?

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

int main() {
    
char name [100];
char str [10];
int discount = 0 ;
int age;
char service_codes[4][6];


printf("Welcome to Nelson Lanka Hospital \n");
printf("Our Services : \n SV105 - Doctor Channeling \n SV156 - Pharmacy \n SV128 - Laboratory \n SV100 - OPD \n \n");

printf("Enter your Details \n Name : ");
scanf("%[^\n]",name);
printf(" Enter age : ");
scanf("%d",&age);



printf(" Enter the Sevice code for the service you need : ");
scanf("%s", str);
strcpy(service_codes[0], str);


for(int i = 1; i<4; i++){

    char yn [2] = "y";
    printf("Do you need any other sevices? (y/n) : ");
    gets(yn);
    if (strcmp(yn, "n")==0){
        break;
    }
    printf(" Enter the Sevice code for the service you need : ");
    scanf("%s", str);
    strcpy(service_codes[i], str);
    printf("%s \t %s \t %d \n",service_codes[i],str,i);

}


for (int x = 0; x<4; x++){
    printf("%s \n",service_codes[x]);
}

}

Yanıtlar

Claudix Sep 23 2020 at 14:17

Bazı nedenlerden dolayı, scanf () döngü sayacı i'yi 0 olarak tutuyor.

Muhtemelen yığındaki değişkenleri (değişken gibi i) değiştiren bir arabellek taşması yaşıyorsunuz . Programınızda arabellek taşmasının meydana gelebileceği en az iki nokta görüyorum:

  • scanf("%s", str);: dizide stryalnızca 9 karakterlik yer vardır (artı bir dize sonlandırıcı olarak kullanılan 1 uç boş karakter). 9 karakterden uzun bir dize yazarsanız (ENTER tuşuna bastığınızda eklenen satırsonu ve satır başı karakterleri dahil) scanf, yığını bozar.

  • strcpy(service_codes[i], str);: dizideki her öğe, her biri service_codes6 bayta sahip olacak şekilde tanımlanır (5 karakter için yer artı 1 uç boş sonlandırıcı). Bundan strdaha uzun olabilen böyle bir dizeyi kopyalayarak service_codebir arabellek taşmasıyla karşılaşacaksınız.

C, her şeyi yapmanıza, hatta kendi ayaklarınıza ateş etmenize izin veren güçlü bir dildir. Kodunuzda yazdığınız her satıra dikkat etmelisiniz!