2015-11-19 63 views
0

該任務主要是使用指針來輸入一個字符串,並在有'\'字符的地方對其進行分片,並使用指針在單獨的行中輸出它們。當我使用數組而不是指針時,程序運行正常。但是,使用存儲字符串的指針給出消息「分段錯誤」。代碼如下:使用指針字符串給出分段錯誤

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

int main() { 
char *name; 
char *sep[100]; 
int i = 0, j = 0, k = 0; 
scanf("%[^\n]s", name); 

for(i = 0; (*(name+i)) != '\0'; i++) { 
    if((*(name+i)) == '\\') { 
     *((*(sep+k))+j) = '\0'; 
     j = 0; 
     k++; 
    } else { 
     *((*(sep+k))+j) = *(name+i); 
     j++; 
    } 
} 

for(i = 0; i <= k; i++) { 
    printf("%s\n", *(sep+i)); 
} 

return 0; 
} 

這將是真棒,如果你能指出什麼,哪裏出了問題,而不是給我一個替代解決方案。 TIA。

+1

您必須爲'sep'數組中的每個指針分配空間。 'name' var也一樣。 – LPs

回答

1

你的指針是空pointers.you通過使用它們,而不將其分配給分配memory.Allocate內存,從而使您能夠正確地使用它們和存儲字由\。也分開調用未定義的行爲,你可以使用[]而不是*

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

int main() 
{ 
    char name[256]; 
    char *sep[100]; 
    for(int n = 0 ; n < 100 ; n++) 
    { 
     sep[n] = malloc(30*sizeof(char)); 
    } 
    int i = 0, j = 0, k = 0; 
    scanf(" %255[^\n]s", name); 

    for(i = 0; name[i] != '\0'; i++) 
    { 
     if(name[i] == '\\') 
     { 
      sep[k][j] = '\0'; 
      j = 0; 
      k++; 
     } 
     else 
     { 
      sep[k][j] = name[i]; 
      j++; 
     } 
    } 

    sep[k][j] = '\0'; 
    for(i = 0; i <= k ; i++) 
    { 
     printf("%s\n",sep[i]); 
    } 
    for(int n = 0 ; n < 100 ; n++) 
    { 
     free(sep[n]); 
    } 
    return 0; 
} 
+0

謝謝。我認爲問題出在指針內存的分配上。不幸的是,我完全忘了malloc()。 豎起大拇指的男人。 – user5581455

+0

'name'不一定是* NULL,也不是'sep'的元素。但它們未初始化,這相當糟糕。 –

0

在你的代碼,

scanf("%[^\n]s", name); 

name是unintialized指針。它不指向任何有效的內存位置。您需要分配內存才能使用它。

sep數組也一樣。

如果你想要堅持一個指針,你可以考慮使用一個數組來實現這個目的,或者看看man pagemalloc()。使用單位指針可以導致。

-1

您可以撥打scanf,並帶有未初始化的name

0

您必須爲您的指針分配空間以避免未定義的行爲:如果不初始化它,則不能使用指針。

int main() { 
    char *name = malloc(MAX_DIM_OF_NAME+1); 
    char *sep[100]; 

    for (int i=0; i<100; i++) 
     sep[i] = malloc(MAX_DIM_OF_NAME+1); 

    ....