2010-04-21 3 views
1

im пытается прочитать слово от пользователя, затем динамически выделяет память для слова и сохраняет его в массиве struct, который содержит char *. Я продолжаю получать неявное объявление функции âstrlenâ, поэтому я знаю, что я что-то не так.Выделение памяти для указателя char, являющегося частью структуры

struct unit 
{ 
    char class_code[4]; 
    char *name; 
}; 

char buffer[101]; 
struct unit units[1000]; 

scanf("%s", buffer); 

units[0].name = (char *) malloc(strlen(buffer)+1); 
strcpy(units[0].name, buffer); 
+2

Я предполагаю, что это должно быть 'struct unit', а не' struct class'. –

+0

@ Ken, это совершенно законно в C. – Earlz

+1

@Earlz - факт, что он является законным C, совершенно не имеет значения. Он объявляет структуру с тегом «класс», который никогда не используется, но использует структуру с тегом «единица», которая нигде не объявлена. – Dipstick

ответ

1

Убедитесь, что вы делаете:

#include <string.h> 

включить STRLEN) объявление функции (.

Кроме того, вы должны действительно использовать strnlen() и strncpy() для предотвращения ошибок.

+0

Здесь нет ошибок. Он выделяет достаточно памяти для строки, основываясь на знании содержимого строки. Это абсолютно безопасное использование 'strcpy'. Использование 'strlen' также прекрасное, если' scanf' не переполняет 'buffer'. Он может захотеть добавить длину поля в '% s', чтобы убедиться в этом. –

+4

В этом случае ''% 100s '' как строка формата 'scanf'. – caf

7

Implicit declaration of function 'strlen' означает, что вы забыли #include заголовок, объявляющий его, в этом случае <string.h>

Это единственная ошибка я вижу в вашем коде.

+0

спасибо, я знал, что это будет что-то подобное, но не может думать о том, что это было. im все еще новичок в этом, поэтому я делаю кучу глупых ошибок – user321853

4

Кроме отсутствующего заголовка, string.h, вы можете заменить таНос + STRCPY на strdup.

units[0].name = strdup(buffer); 
+0

jweyrich: Does strdup() выделяет память char *? Таким образом, вы можете сделать strcpy (единицы [0] .name, «123»), а затем бесплатно (единицы [0] .name), когда это будет сделано? Это ANSI C? – Sunscreen

+0

@Sunscreen: yes –

+0

Прохладный, я буду использовать его, когда смогу :) – Sunscreen

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