簡體   English   中英

無法將字符串放入2D數組中

[英]Can't put a string in a 2d array

我正在嘗試創建一個將字符串作為參數並返回一個表的函數,該表在每個隔離專區中都包含給定字符串的單詞。

這是我的代碼:

#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);
 }

I have this result 當我使用我得到這個結果

��

��

��

��

��

��

��

��

��

��

��

��

��

��

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()調用,則會導致大量內存泄漏。

屏幕上顯示的內容是讀取無效內存的副作用,並且您很幸運得到任何信息,很可能會發生頁面/段錯誤,並且這樣會造成安全漏洞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM