2017-01-06 4 views
-4

У меня проблема с кодом в C. Мне нужно ввести список имен, разделенных кнопкой ввода. Вход останавливается, когда пользователь вводит слово «QUIT». программе необходимо распечатать список имен в алфавитном порядке (все буквы строчные).Динамическое распределение массива указателей

Количество имен, а также длина каждого имени неизвестны и должны быть динамически распределены. Кроме того, если имя появляется более одного раза на входе, оно должно появляться только один раз на выходе.

вот пример того, как код должен работать:

Please enter a list of names: 

john 

chris 

ben 

chris 

david 

QUIT 

Есть 4 названия:

ben 

chris 

david 

john 

Я думал об использовании динамически назначаемый массив указателей, в котором каждый указатель содержит каждый имя и динамическое выделение. Проблема в том, что я не знаю, как написать его, не получив ошибку во время выполнения.

Примечание: на данный момент мне не разрешено использовать вещи, которые я еще не изучил, например, структуры и рекурсии, и могут использовать только библиотеки stdio.h, stdlib.h и string.h.

Заранее спасибо.

вот код (это не полный, но я получаю сообщение об ошибке выполнения на данный момент):

char **nameList; 
int i = 0, j = 0, size = 0, check = 0; 
printf("Please enter list of names:\n"); 
//allocate one cell of memory to the list 
nameList = (char**)malloc(sizeof(char)); 
if (nameList == NULL) 
{ 
    printf("Cannot allocate Memory"); 
    return 0; 
} 
//Add the first letter to the first string in the array 
nameList[i][j] = getchar(); 
size += sizeof(char); 
while (check != 1) 
{ 
    //check if current entered letter is not an enter 
    while (nameList[i][j] != '\n') 
    { 
     //allocated another char sized memory to the string 
     nameList = (char**)realloc(nameList, (size + sizeof(char))); 
     if (nameList == NULL) 
     { 
      printf("Cannot allocate Memory"); 
      return 0; 
     } 
     j++; 
     //adding another char to the current string 
     nameList[i][j] = getchar(); 
     size += sizeof(char); 
    } 
    j = 0; 
    if (nameList[i][j] == 'Q') 
    { 
     if (nameList[i][j + 1] == 'U') 
      if (nameList[i][j + 2] == 'I') 
       if (nameList[i][j + 3] == 'T') 
        check++; 
    } 
    i++; 
} 
+1

Пожалуйста, прочитайте [ask] и [mcve]. Вы упоминаете ошибку времени выполнения, какой код это вызывает? Мы можем помочь с конкретными проблемами, которые вы попытались исправить, но Stack Overflow не является службой написания кода. – whrrgarbl

+0

Хорошо, вы должны иметь возможность сделать это с динамическим распределением массива указателей и строк. Поэтому вы должны показать текущий код и вашу ошибку. –

+0

Я буду голосовать за любой ответ, который лишает этого ученика его возможности учиться. –

ответ

0

списке имен = (символ **) перераспределить (списке имен, (размер + SizeOf (символ)));

Uhm ... Почему вы используете '+' там? И вы также ищете размер неправильной стоимости.

Это выделяет массив указателей. Но на что указывают указатели?

+0

Я использую символ «+», потому что я хочу добавить другую память в размере символа в строку каждый раз, когда я ввожу букву, пока строка не «QUIT». Основная проблема заключается в том, что я не знаю, правильно ли это сделать, и если realloc следует использовать как для списка массивов, так и для каждой строки. Каждый указатель должен указывать на каждую введенную строку, и каждая из строк разделяется, когда вход является вводом. – Evi

+0

Строки нужно выделять отдельно. – luckykaa

+0

Каждый элемент массива является указателем на строку. Поэтому nameList [0] является указателем на строку и эта строка должна быть выделена. namelist [1] является указателем на следующую строку и так далее для nameList [2] для nameList [i]. Для новичков может быть довольно сложно отслеживать указатели на указатели, поэтому я немного волнуюсь, что следующий совет может вас смутить. Но вы все еще найдете здесь проблему. nameList - это список «char *» (указатель на char), а не «char», вам нужно будет использовать sizeof (char *) – luckykaa

Смежные вопросы