【问题标题】:Can't put a string in a 2d array无法将字符串放入二维数组
【发布时间】:2017-01-20 18:21:53
【问题描述】:

我正在尝试创建一个函数,该函数将字符串作为参数并返回一个表,该表在每个隔间中包含给定字符串的单词。

这是我的代码:

#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 我有这个结果

��

��

��

��

��

��

��

��

��

��

��

��

��

��

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)

效果很好。

【问题讨论】:

  • 您的代码中没有二维数组。指针不是数组!
  • 似乎发生了缓冲区溢出。
  • 请向我们展示一个示例输入和预期输出。

标签: c string malloc


【解决方案1】:

我从您的代码中了解到您想将文本放入选项卡中。那么你不应该分配选项卡本身,而是将指针设置为选项卡作为值。

所以你要分配这个:

tab = malloc(...)

这应该类似于

*tab = malloc(...)

否则,您作为参数发送的实际选项卡值将被覆盖,从而导致目标错误。

如果您将 tab 声明为单个未分配的指针,那么您可以使用 & 号发送它:

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

另外,我建议您对源字符串使用 const 参数,以防止您错误地修改它。

另外,我不认为你想这样做,因为没有free() 调用,这是很多内存泄漏。

你在屏幕上看到的是读取无效内存的副作用,你很幸运能得到任何东西,很可能会发生页面/分段错误,这样就会造成安全漏洞。

【讨论】:

    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多