Я работаю над языком программирования K&R C и в настоящее время работаю над главой 5 (указатели). У меня проблема с упражнением 5-3:
«Напишите версию функции strcat, показанную в главе 2, с указателем: strcat(s,t) копирует строку t в конец s».
Я написал код ниже:
#include<stdio.h>
void pointer_strcat(char *stringOne, char *stringTwo);
main(){
char *initialString = "Flash. ";
char *middleString = "Welcome.";
char *addedString = "Thunder.";
pointer_strcat(initialString, addedString);
printf("%s \n", initialString);
}
void pointer_strcat(char *stringOne, char *stringTwo){
while(*stringOne++ != '\0'){
}
*stringOne--;
while( (*stringOne = *stringTwo) != '\0'){
stringOne++;
stringTwo++;
}
}
Я пытался внимательно следовать примерам в этой главе, но всякий раз, когда я запускаю этот код, происходит зависание, и я получаю всплывающее окно, в котором говорится, что .exe перестал работать, прежде чем вернуться в командную строку. Я возился с кодом в разные стороны и обнаружил, что если я изменю объявления указателей строк на массивы (*initialString становится initialString[]), все работает именно так, как я хочу. Меня это особенно раздражает, потому что на странице 83 написано:
"Как формальные параметры в определении функции, char s[]; и char *s; эквивалентны;..."
Мне действительно не помешал бы совет, почему эти разные объявления имеют такую радикально разную производительность при запуске .exe, хотя обе версии компилируются.
char arrayOne[] = "hello world";
, это будет потому, что вам разрешено объявлять массив без размера, если вы его инициализируете, поскольку компилятор определит необходимое пространство по количеству предоставленных инициализаторов. - person Shafik Yaghmour   schedule 25.07.2014arrayOne = "hello world";
преобразует строковый литерал в указатель на строковый литерал, который нельзя изменить. Во втором случае у вас есть массив, и в него копируется строковый литерал. - person Shafik Yaghmour   schedule 25.07.2014