2017-01-20 9 views
0

文字列をパラメータとして受け取り、各コンパートメントに指定された文字列の単語を含むテーブルを返す関数を作成しようとしています。私はAVを使用するときは、これは私が持っていることを期待した結果ではないです見ることができるように、私はこの結果2次元配列に文字列を配置できません

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

�� 

USER=benoit.pingris 
JRE_HOME=/usr/lib64/jvm/! 
LS_COLORS=no=00:fi=00:di! 
LD_LIBRARY_PATH=:/home/b! 
XDG_SESSION_PATH=/org/fr! 
XNLSPATH=/usr/share/X11/! 
GLADE_MODULE_PATH=:/usr/! 
XDG_SEAT_PATH=/org/freed! 
HOSTTYPE=x86_64 
QEMU_AUDIO_DRV=pa 
CPATH=:/home/benoit.ping! 
SSH_AUTH_SOCK=/tmp/ssh-a! 
SESSION_MANAGER=local/pc! 
FROM_HEADER= 
CONFIG_SITE=/usr/share/s! 
PAGER=more 
CSHEDIT=emacs 
XDG_CONFIG_DIRS=/etc/xdg! 
MINICOM=-c 
on 

を持って

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

int  nb_words(char *str) 
{ 
    int i; 
    int nb; 

    i = 0; 
    nb = 1; 
    while (str[i] != '\0') 
    { 
     if (str[i] == ' ') 
     nb++; 
     i++; 
    } 
    return (nb); 
} 

void my_show_wordtab(char **tab) 
{ 
    int i; 

    i = 0; 
    while (tab[i] != NULL) 
     { 
     printf("%s\n", tab[i]); 
     i++; 
     } 
} 

char **put_in_tab(char *str, char **tab) 
{ 
    int i; 
    int j; 
    int k; 

    i = 0; 
    j = 0; 
    if ((tab = malloc(sizeof(char *) * (nb_words(str) + 1))) == NULL) 
    return (NULL); 
    while (str[i] != '\0') 
    { 
     if ((tab[j] = malloc(sizeof(char) * (strlen(str) + 1))) == NULL) 
     return (NULL); 
     k = 0; 
     while (str[i] != ' ' && str[i] != '\0') 
     { 
      tab[j][k] = str[i]; 
      k++; 
      i++; 
     } 
     tab[j][k] = '\0'; 
     j++; 
     i++; 
    } 
    tab[j] = NULL; 
    my_show_wordtab(tab); 
    return (tab); 
} 

int  main(int ac, char **av) 
{ 
    char **tab; 

    if (ac != 2) 
    return (1); 
    if ((tab = put_in_tab(av[1], tab)) == NULL) 
    return (1); 
    return (0); 
} 

は、ここに私のコードです。私はAVが、この

my_str_to_wordtab("this is an orignal test", tab) 

のような文字列なしで私の関数を呼び出すことにした場合しかし、それが正常に動作します。

+0

コードに2D配列がありません。ポインタは配列ではありません! – Olaf

+0

バッファオーバーランが発生したようです。 – BLUEPIXY

+0

入力例と出力例を示してください。 – RoadRunner

答えて

2

私があなたのコードから理解することは、テキストをタブに入れたいということです。次に、タブ自体を割り当てるべきではなく、値としてタブにポインタを設定します。

ですから、この配分されています

tab = malloc(...) 

をこれが

*tab = malloc(...) 

の線に沿って何かする必要がありそうでない場合、あなたは、パラメータとして送る実際のタブ値は、先を引き起こし、上書きされます間違っている。

あなたは、あなたがアンパサンドを使用して送信することができ、単一、未割り当て、ポインタでタブを宣言したい場合:

... 
char *tab; 
... 
tab = NULL; 
... 
my_str_to_wordtab(..., &tab); 

また、私はあなたの元の文字列へのconstパラメータを使用することをアドバイスうそれを間違って変更しないようにします。

また、free()の呼び出しがなければ、メモリリークが多いので、このようにしたくないと思います。

無効なメモリを読み取ることによる副作用があり、何かを得ることは幸運です。ページ/セグメント化の不具合が発生し、このような方法でセキュリティ違反が発生する可能性があります。