Я искал здесь, но, пожалуйста, простите меня, если этот пост является дубликатом ... Я просто хочу прояснить вещи, в которых я не уверен ...
Прежде всего, позвольте мне дать представление о том, что я имею в виду:
- Пользователю будет предложено ввести команду (аналогично командам командной строки/оболочки).
- Команда будет получена/введена в виде строки, разделенной пробелами.
- Далее строка будет токенизирована (разделена), будет подсчитано количество слов.
- Имея под рукой такое количество слов, мне придется создать динамический многомерный массив строк, где размер/количество строк — это количество слов, которые мы подсчитали.
Пример:
Я Имя 1234123 123123
Количество слов/строк внутри этой команды равно 4, поэтому количество указателей на строки будет распределяться динамически.
Я хочу, чтобы эти строки хранились в динамическом многомерном массиве, где:
char ** arguments;
int count;
Я хочу получить доступ к значениям внутри массива arguments как:
for(i = 0; i < count; i++)
printf("%s", arguments[i]);
МОЯ ПРОБЛЕМА
Когда я пытаюсь получить доступ к этим переменным в моей основной функции, значения внутри переменной arguments являются мусором, а переменная count продолжает увеличиваться, зная, что я инициализировал count переменная возвращается к 0.
Вы можете проверить мой код, если я сделал что-то расплывчатое или неправильное. Спасибо!
Вот коды, которые мне удалось создать там, где я считаю полезными:
/* This function counts the number of words inside the command input. */
int word_count(char * str)
{
int i, ctr;
for(ctr = i = 0; str[i] != '\0'; i++)
{
while(isspace(str[i]))
i++;
if(str[i] != '\0')
{
ctr++;
while(str[i] != '\0' && ! isspace(str[i]))
i++;
}
}
return ctr;
}
/* This function splits the strings inside the command. */
void split_command(int count, char *** argv, char * command)
{
char buffer[31];
int i, j, k;
*argv = (char **) malloc(sizeof(char *) * count);
for(i = k = 0; command[i] != '\0'; i++)
{
while(isspace(command[i]))
i++;
if(command[i] != '\0')
{
for(j = 0 ;j < 30 && command[i] != '\0' && ! isspace(command[i]); j++, i++)
buffer[j] = (j != 0) ? command[i] : toupper(command[i]);
buffer[j] = '\0';
if(strlen(buffer) > 0)
{
(*argv)[k] = (char *) malloc(sizeof(char) * (strlen(buffer) + 1));
strcpy((*argv)[k], buffer);
k++;
}
}
}
}
/* This function will re-initialize the provided arguments and counters. */
void prepare_command(int * count, char *** argv)
{
int i;
for(i = 0; i < *count; i++)
{
(*argv)[i] = NULL;
free((*argv)[i]);
}
*count = 0;
free(*argv);
*argv = NULL;
}
Главная
void main(void)
{
char ** arguments, * command;
int count, i;
boolean end = False; // Assume I created an enum for boolean {False, True}
/* Some initialization here. */
count = 0;
arguments = NULL;
do
{
gets(command);
count = word_count(command); /* This will return the number of strings inside the command */
split_command(count, &arguments, command); /* This will allocate an array. */
/* When I try to display something from here, some values are garbage and some are from the previous allocation... */
for(i = 0; i < count; i++)
printf("%s\n", arguments[i]);
prepare_command(&count, &arguments);
}while(!end);
}
PS: я знаю strtok и просто не хочу его использовать, и у меня нет strtok_r ни в одной из моих библиотек. Поэтому я создал свою собственную функцию, чтобы позаботиться о чем-то подобном.
Это может быть длинный пост, но я бы хотел, чтобы вы помогли мне, ребята... Спасибо! Придется отредактировать этот пост, если это необходимо. Спасибо, надеюсь, вы пролили на меня свет. :3 :)
malloc()
, и наказывает вас. - person   schedule 29.09.2012prepare_command
не освободит блок памяти, поскольку вы сначала назначаете NULL элементу argv, а затем вызываете free для этого значения - person Serge   schedule 29.09.2012gcc -Wall -g
в Linux. Используйте отладчик, напримерgdb
. Используйтеvalgrind
для обнаружения утечек памяти и т. д. Используйтеstrdup
для дублирования строки. - person Basile Starynkevitch   schedule 29.09.2012command
передается неинициализируемомуgets
. - person Serge   schedule 29.09.2012void *
неявно совместим с любым типом указателя - приведение - это плохая практика.) - person   schedule 29.09.2012