2017-10-05 229 views
0

我試圖使用strncpy,然後是strcpy,反之亦然,但我在運行時不斷收到分段錯誤。我認爲這是因爲函數中存在邏輯錯誤,但我切換了他們的位置,只有第一個執行。調用strcpy時出現分段錯誤

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

int main(void) 
{ 
    char c = ' ', sentence[50], *pointer_to_string; 
    pointer_to_string = &sentence[0]; 
    int index = 0; 

    printf("Please enter a sentence:"); 
    while ((c = getchar()) != '\n') 
    { 
     sentence[index] = c; 
     index++; 
    } 
    sentence[index] = '\0'; 

    char *string_copy1, *string_copy2; 

    strncpy(string_copy1, pointer_to_string, 5); 
    printf("strncpy(string_copy1, pointer_to_string, 5):\n"); 
    printf("%s\n", string_copy1); 

    strcpy(string_copy2, pointer_to_string); 
    printf("strcpy(string_copy2, pointer_to_string):\n"); 
    printf("%s\n", string_copy2); 
} 
+0

嘗試與'-g'標誌和使用的valgrind編譯而執行程序:'的valgrind/a.out' =>你會得到更多的信息 – YaatSuka

+1

'的char * string_copy1,* string_copy2;'沒有。初始化這些變量之一。所以他們都沒有指向有效的內存位置。然後你使用str(n)cpy來覆蓋一個字符數組的內容 - 也就是一個「字符串」 - 但是你給它的指針並不指向這樣一個數組。因此,未定義的行爲隨之而來。 – rici

+1

在使用它們之前,您需要初始化'string_copy1'和'string_copy2;'。使用malloc瞭解如何在這裏http://en.cppreference.com/w/c/memory/malloc –

回答

3

documentation參見:

char *strcpy(char *dest, const char *src); 

的第一個參數是一個指向目的緩衝區。但是你的指針沒有初始化:

char *string_copy1, *string_copy2; 

因此,指針包含一些垃圾值。並strcpy()寫入不屬於您的程序的內存。它導致segmentation fault

char string_copy1[50] = { 0 }; 
char string_copy2[50] = { 0 }; 

用零填充它們時,只需要避免的問題strncpy()

如果第一n字節src之間沒有空字節,放置在dest的字符串不能以null結尾。

+0

如何初始化它們? strncopy的第一個函數起作用。 – Gideon

+0

謝謝,我指出了新的字符數組的指針,並且這些函數起作用。 – Gideon

+1

請勿使用strncpy()。它並沒有達到你所期望的程度,除了在數據庫中設置固定寬度的字段(實際上它是用來設計的)之外,它實際上是無用的。 –