Копирование массивов в C - PullRequest
0 голосов
/ 14 января 2011

В моей C-программе я пытаюсь скопировать массив char в другой массив, удаляя первый элемент (элемент 0).

Я написал:

char array1[9];
char array2[8];
int i, j;

for(i = 1, j = 0 ; i < 10, j < 9; i++, j++){
        array2[j] = array1[i];
}
printf(array2);

Когда я печатаю array2, это вызывает переполнение стека.

Есть идеи?

Ответы [ 7 ]

3 голосов
/ 14 января 2011

Два вопроса: Во-первых, при печати строки с printf и работе с другими стандартными строковыми функциями в целом ваши массивы символов должны заканчиваться нулем, чтобы функции знали, где заканчивается строка. Вы также пишете один за концом своих массивов.

Во-вторых, при использовании printf почти всегда плохая идея использовать строку, которую вы хотите напечатать, в качестве строки формата. Используйте

printf("%s", array2);

вместо этого. Если вы используете printf, как в исходном примере, и на массив2 может влиять пользователь, то ваша программа, скорее всего, уязвима к уязвимости строки формата.

2 голосов
/ 14 января 2011

Используйте memcpy ():

memcpy( array2, &array1[1], 8 );

Это проще.

2 голосов
/ 14 января 2011

Ваша строка не оканчивается нулем, поэтому при ее печати она продолжает печатать символы после 8, выделенных вами в поисках, но до этого места в стеке не хватает. Вы также пишете на один символ больше, чем вы выделили, и ваши условия должны быть «объединены» с && - a , игнорирует результат первого выражения. Вам также следует избегать использования строковой переменной в качестве форматера строк для printf.

Вот ваш код исправлено :

char array1[10] = "123456789";
char array2[9];
int i, j;
for(i = 1, j = 0 ; i < 10 && j < 9; i++, j++){
        array2[j] = array1[i];
}
printf("%s\n", array2);

Вы также можете упростить цикл, используя единственную индексную переменную i и индексируя array2 с помощью i+. Вы также можете полностью удалить цикл, используя strncpy, но помните, что если n меньше длины строки + 1, это не добавит нулевой терминатор.

1 голос
/ 15 января 2011

Нет необходимости использовать дополнительный массив2, такой как

printf("%.8s",array1+1);
0 голосов
/ 14 января 2011

Просто используйте strcpy() (если они обе строки!) strcpy() хочет указатель на источник и указатель на место назначения. Если вы хотите пропустить первый элемент исходного массива, просто передайте source + 1:

char source[] = "ffoo";
char dest[] = "barbar";

strcpy(dest, source + 1);

// now dest is "foo" (since the ending \0 is copied too)

printf("\n%s\n", dest);
0 голосов
/ 14 января 2011

Чтобы еще больше расширить ответ marcog: вы объявляете array1 с 9 элементами, 0-8, а затем пишете с 0-9 (10 элементов).То же самое с массивом2.

0 голосов
/ 14 января 2011

Когда вы говорите printf(array2), он думает, что печатает строку с нулевым символом в конце. Поскольку в (1003) (возможно) нет \0, printf продолжается после конца array2, забираясь в память, это не предполагается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...