2013-02-27 112 views
0

我得到一個分段錯誤不能strcpy分段錯誤

所以在頂部我有typedef字符*字符串;

然後我只是有一個設置爲STR約5

for(i=0; i<=spaces; i++) { 
    sepwords[i] = malloc(3000); 
} 

變量稱爲空間是一個字符數組,我期待的空間和複製到那時

while(str[i]!=' ') { 


    printf("%d\n", i); 
    strcpy(sepwords[i], "hello"); 
    i++; 

} 

使實際工作

但是如果我做

while(str[i]!=' ') { 
    char *temp[100]; 
    *temp=str[i]; 


    printf("%d\n", i); 
    strcpy(sepwords[i], *temp); 
    i++; 




} 

它seg seg在此

我不認爲這是因爲我使用typedef字符串,因爲我事先分配內存。

有什麼想法?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLINE 256 

char *progn; 

void usage(void) { 
    fprintf(stderr, "Usage: %s pattern\n", progn); 
} 
typedef char * string; 

int pattern_match(char *pattern, char *str) { 






int i=0; 
int spaces=0; 

while(str[i]!=0) { 
    if(str[i]==' ') { 
     spaces++; 
    } 
    i++; 
} 
string sepwords[spaces]; 





for(i=0; i<=spaces; i++) { 
    sepwords[i] = malloc(3000); 
} 


i=0; 


while(str[i]!=' ') { 
    char *temp[100]; 
    *temp=str[i]; 


    printf("%d\n", i); 
    strcpy(sepwords[i], temp); 
    i++; 




} 









//printf("%d\n", spaces); 



//strs[0]="hiya boy"; 
//printf(strs[1]); 





} 

int main(int argc, char **argv) { 

    char line[MAXLINE]; 
    char *pattern; 
    progn = argv[0]; 

    if (argc != 2) { 
     usage(); 
     return EXIT_FAILURE; 
    } 
    pattern = argv[1]; 

    while (!feof(stdin) && !ferror(stdin)) { 
     if (!fgets(line, sizeof (line), stdin)) { 
      break; 
     } 
     if (pattern_match(pattern, line)) { 
      printf("%s", line); 
     } 
    } 
    if (ferror(stdin)) { 
     perror(progn); 
     return EXIT_FAILURE; 
    } 
    return EXIT_SUCCESS; 
} 
+0

在哪個平臺上?嘗試內存調試器工具。 – Zaffy 2013-02-27 22:34:45

+0

我認爲你沒有掌握C語言的語義和可能的語法。一個有用的技巧是從標識符開始讀取它們,然後通過任意括號,然後通過* s和qualifers,所以char * temp [100]讀作「temp是一個100個指向char的指針的數組」 – Clyde 2013-02-27 22:36:02

+0

我想建議你解釋你實際想要達到的目標。從您發佈的代碼片段中不明顯。 – Clyde 2013-02-27 22:37:34

回答

1

你的代碼中有兩個語法錯誤。你的編譯器必須提醒大家介紹他們:

*temp=str[i];

溫度是char * [100],* 溫度等於氣溫[0],這是一個char *。但是str [i]是char。 所以你把char(單字節)放到char *(地址)中。

strcpy(sepwords[i], temp);

溫度是100字符*的全數組的地址,所以你複製就像一個大的字符,直到一些零字節被發現。

還有這樣的錯誤:

string sepwords[spaces];

for(i=0; i<=spaces; i++) {

sepwords[i] = malloc(3000); 

它是:ⅰ<空間,不我< =空格,因爲串sepwords [空格]分配一個 「空間」 -length陣列,從0到空間1。

最後: 如果你的輸入,不能有空格,沒有終點條件的同時(STR [1] ='「!) 這是你得到你的賽格故障(GDB是你的朋友),因爲你最後看着str的結尾(過去的最後\ 0字節)

+0

那麼我如何解決strcpy問題? – user2054534 2013-02-28 06:17:53

0
  1. 而不是定義字符*字符串,把它定義爲PChar類型。一個char *不是一個字符串,它是一個指向一個字符的指針,它可能是也可能不是一個字符的地址,可能在內存中由其他字符0結尾。這很重要,因爲undefined_pchar = segmentation fault的值。 undefined_string =「」的值。

  2. fprintf(stderr, "Usage: %s pattern\n", progn);這打印未定義的預測。這可能是非法內存,或者可能是隨機收集的內存。無論哪種情況都不好。所以你應該指出你何時宣佈你的預測pchar progn = 0表明你明白這個概念。 sepwords [i]是一個字符,通過說sepwords [i] = malloc(3000),如果它甚至編譯完成,將會濫用符號。請使用pchar *來創建c樣式字符串的列表。

    for(i = 0; i < = spaces; i ++){ sepwords [i] = malloc(3000); }

我很想在發現錯誤給予了一槍,但意圖已經是有點清楚,我明白你正在嘗試做的,無論是通過評論,或者通過適當類型的使用。

+0

'strncpy'不是'strcpy'的神奇版本,它具有不同的語義,並且它本身並不修復錯誤。 – wRAR 2013-02-27 22:35:24

+0

如果你真的不知道你想做什麼,那麼斷言就無濟於事。 – Clyde 2013-02-27 22:36:36

+0

如果你使用斷言,你肯定知道你在做什麼。如果沒有,那麼你不能發佈代碼示例,你必須發佈意圖。沒有明確的意圖,代碼將不起作用,或者存在根本性缺陷。 – Dmitry 2013-02-27 23:09:51