>我正在尝试创建一个函数,该函数将字符串作为参数并返回一个表,该表在每个隔间中包含给定字符串的单词。
这是我的代码:
#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] != ' ')
{
if (str[i] == ' ')
nb++;
i++;
}
return (nb);
}
void my_show_wordtab(char **tab)
{
int i;
i = 0;
while (tab[i] != NULL)
{
printf("%sn", 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] != ' ')
{
if ((tab[j] = malloc(sizeof(char) * (strlen(str) + 1))) == NULL)
return (NULL);
k = 0;
while (str[i] != ' ' && str[i] != ' ')
{
tab[j][k] = str[i];
k++;
i++;
}
tab[j][k] = ' ';
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 时,我有这个结果
��
��
��
��
��
��
��
��
��
��
��
��
��
��
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
如您所见,这不是我期望的结果。但是,如果我决定在没有 av 的情况下调用我的函数,而是像这样的字符串
my_str_to_wordtab("this is an orignal test", tab)
它工作正常。
我从您的代码中了解到的是,您希望将文本放入选项卡中。然后,不应分配选项卡本身,而应将指针设置为选项卡作为值。
所以你分配这个:
tab = malloc(...)
这应该是类似于
*tab = malloc(...)
否则,作为参数发送的实际选项卡值将被覆盖,从而导致目标错误。
如果将 tab 声明为单个未分配的指针,则可以使用 & 符号将其发送:
...
char *tab;
...
tab = NULL;
...
my_str_to_wordtab(..., &tab);
另外,我建议对源字符串使用 const 参数,以防止您错误地修改它。
另外,我认为您不想这样做,因为如果没有free()
调用,就会发生大量内存泄漏。
您在屏幕上得到的是读取无效内存的副作用,您很幸运能得到任何东西,可能会发生页面/分段错误,从而产生安全漏洞。