2015-05-14 20 views
5

Programım, kullanıcının bir karakter dizisine kopyalanacak olan dizgisini sağlamasını ister. Ardından, for döngüsüyle, program sadece ilk dizinin elemanlarını ikinci diziye kopyalar. Ben dize iki kez basılmış olur printf() işlevini kullanarak dize yazdırmak AncakC dizgisinde C neden kullanılır?

int main() { 

    int i; 
    char string1[4], string2[4]; 

    // Get the first string 
    printf("Insert your string: "); 
    scanf("%s", string1); 

    // Copy the values into the second array 
    for (i = 0; i < 4; i++) { 
     string2[i] = string1[i]; 
    } 

    // Print the second string 
    printf("%s", string2); 
    return 0; 
} 

.

çıkış

barsbars

neden oluyor olacak ı giriş kelimesi

bar

diyelim?

cevap

6
char string1[4], string2[4]; 

4 öğeli karakter dizisi, 4 karakterlik dizeler için yeterli değildir. '\0' karakterini sonlandırmak için bir tane daha ihtiyacınız var.

4

Neden?

TL; DR cevap: undefined behaviour.

(4 elemanlar için), bars gibi bir girdi dizisi, (sonlandırıcı \0 depolamak amacıyla) ayrılan bellek bölgesini overruning olacak string1[4] gibi tanımlanan bir giriş dizisi ile, burada, sorunu açıklamak için bu da undefined behaviour'u çağırır.

Her zaman sizin scanf()

scanf("%3s", string1); 
gibi görünmelidir string1[4] bir giriş dizisi için gibi, giriş tampon uzunluğu dikkatli olmalıdır
1
char bString []= {'s','t','r','i','n','g'};    
printf("bString:%s\n", bString); 

Çıktı:

bString:

stringstring

Çözüm: Her zaman dahil sonlandırma karakteri Ude

char bString []= {'s','t','r','i','n','g','\0'};  

Veya sadece yazın:

char bString [] = "string";