2013-03-11 2 views
1

Я пытаюсь скопировать строку в массив строк, но она не работает. Я знаю, что это проблема из-за выделения памяти, но я не вижу, как я могу заставить ее работать, поскольку STRING_LENGTH является константой.Как скопировать строку в массив строк с помощью strcpy?

#define NUMBER_OF_STRINGS 3 
#define STRING_LENGTH 255 
char message_ecran[NUMBER_OF_STRINGS][STRING_LENGTH]; 

int i; 
char texte3[] = "CVC"; 
char texte7[] = "iiiiiiiii"; 

for (i=0;i<=NUMBER_OF_STRINGS;i++) 
{ 
    strcpy(message_ecran[i], texte7); 
} 
strcpy(message_ecran[0], texte3); 

Значения message_ecran после кода:

"CVC" 
null 
"iiiiiiiii" 

ожидаемые значения

"CVC"  
"iiiiiiiii" 
"iiiiiiiii" 
+0

it doesnt't work => cf edit – edi9999

+0

Как вы проверяете значения 'message_ecran'? – hmjd

+5

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

ответ

3

Одна проблема заключается в том, что вы пробежать мимо конца message_ecran в следующем цикле:

for (i=0;i<=NUMBER_OF_STRINGS;i++) 

Поскольку message_ecran[NUMBER_OF_STRINGS] находится за пределами, попытка в strcpy() в него приводит к undefined behaviour.

Редактировать Что касается вашего редактирования, я не могу воспроизвести проблему. Когда я добавляю следующее ваш последний код:

for (i = 0; i < NUMBER_OF_STRINGS; i++) { 
    printf("%d:[%s]\n", i, message_ecran[i]); 
} 

он печатает

0:[CVC] 
1:[iiiiiiiii] 
2:[iiiiiiiii] 
+0

для (i = 0; i <= NUMBER_OF_STRINGS; i ++) все будет в порядке? – kaitian521

+0

проблема связана не с циклом for, а с strcpy вне цикла. Копия вне цикла помещает message_ecran [1] в нуль – edi9999

+4

@ edi9999: Плохая форма, чтобы изменить вопрос в ответ на ответы. Вместо того, чтобы помогать будущим пользователям сайта, это просто путает всех. В любом случае я не могу воспроизвести последнюю проблему, о которой вы сообщаете. – NPE

2

код имеет неопределенное поведение, как это доступ за пределы массива в этой строке:

for (i=0;i<=NUMBER_OF_STRINGS;i++) 

как индексы массива основаны на нуле и работают от 0 до N - 1, где N - это количество элементов в массиве. Это означает, что действительными индексами массива для message_ecran являются только 0 и 1, но 2 будет использоваться как индекс в цикле for. Изменить на:

for (i=0;i<NUMBER_OF_STRINGS;i++) 
0

Кроме того, вы можете начать свой цикл с 1, т.е.

for (i = 1; i < NUMBER_OF_STRINGS; i++) 

, так как вы позже назначая «texte3» на месте нулевому.

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