2016-12-28 10 views
-1

私のプログラムでは無効な読み取りの問題があります。履歴をサポートする簡単なシェルを作成しています。ここに私の問題だ、私は私が今cmd = ^p^l^コマンド^p^l^を、実行変数Cで不正な読み取りを解決するには

char *cmd = malloc(sizeof(char) * 256); 

温家宝を持って、私は歴史を検索し、一致または同じ文字列を返す検索機能にcmdを渡します。この機能を実行した後ft_man_search_replace(&cmd, &pos, hist)

void ft_man_search_replace(char **cmd, int *pos, t_stack hist) 
{ 
    char   **split; 
    t_search_hist search; 
    int    i; 

    // splits ^string^string^ into array 
    split = ft_strsplit(*cmd + 1, '^'); 
    i = *pos; 
    // get previous history and assign it to haystack 
    search.haystack = ft_get_prev_hist(hist); 
    search.needle = split[0]; 
    search.with = split[1]; 
    *cmd = ft_search_replace(search, 0, 0, 0); 
    //if returned string is equal to *cmd, there was no match 
    //assign *cmd to empty string. 
    if (ft_strequ(search.haystack, *cmd)) 
    { 
     ft_putendl("\n21sh: substitution failed"); 
     *cmd = ""; 
     *pos = 0; 
     return ; 
    } 
    i = ft_strlen(*cmd); 
    ft_cursor(*cmd, i + 1, &hist); 
    *pos = i; 
} 

それはだ、私は私の推測を読ん無効取得何かを入力したときcmdは、もはや、256のメモリ割り当てを持っているようだしない私は、文字列の末尾に到達してるということです。例えば一致が見つからなかった場合、私は*cmd = ""を割り当てます。今修正しようとするとcmd私は無効な読み込みをします。これをどうすれば解決できますか?私はreallocを使用することが許されていないので、以下の関数を使って再割り当てしようとしました。

void *ft_realloc(void *ptr, size_t len) 
{ 
    void *real; 

    real = (void *)malloc(len); 
    if (real) 
    { 
     memset(real, 0, len); 
     memcpy(real, ptr, strlen(ptr)); 
    } 
    free(ptr); 
    return (real); 
} 
+1

[mcve]を投稿してください。 – kaylum

+2

あなたはあなたが自由( "")をしていると言っていますか?はい、それは明らかに問題を引き起こすでしょう。 – melpomene

+1

'malloc()'を '(void *)'にキャストすることは意味がありません。コンパイラの警告を避けるためにこれを行った場合、コードには大きな問題があります。あなたは '#include 'を忘れましたか? – melpomene

答えて

3

user3121023*cmd =は、メモリ割り当てを破棄することを指摘したように[OK]を、私は、この問題を解決するために管理している、私の代わりに=strcpymemsetを使用することにしました。

//libraries here 
# define SIZE 256 

char *cmd = malloc(sizeof(char) * SIZE); 

void ft_man_search_replace(char **cmd, int *pos, t_stack hist) 
{ 
    char   **split; 
    t_search_hist search; 
    int    i; 

    // splits ^string^string^ into array 
    split = ft_strsplit(*cmd + 1, '^'); 
    i = *pos; 
    // get previous history and assign it to haystack 
    search.haystack = ft_get_prev_hist(hist); 
    search.needle = split[0]; 
    search.with = split[1]; 
    memset(*cmd, 0, SIZE); 
    strcpy(*cmd, ft_search_replace(search, 0, 0, 0)); 
    //if returned string is equal to *cmd, there was no match 
    //assign *cmd to empty string. 
    if (ft_strequ(search.haystack, *cmd)) 
    { 
     ft_putendl("\n21sh: substitution failed"); 
     memset(*cmd, 0, SIZE); 
     strcpy(*cmd, ""); 
     *pos = 0; 
     return ; 
    } 
    i = ft_strlen(*cmd); 
    ft_cursor(*cmd, i + 1, &hist); 
    *pos = i; 
} 
関連する問題