У меня есть вопрос об использовании strcpy. Я знаю, что стандарт ANSI C говорит: источник и место назначения не должны перекрываться, иначе поведение будет непредсказуемым. Я покажу вам фрагмент кода, который работает так, как я ожидаю, если он скомпилирован с использованием старого компилятора gnu C под Linux.
#include <string.h>
#include <stdio.h>
char S[80],*P;
int main() {
strcpy(S,"abcdefghi\r\njklmnopqr\r\nstuvwxyz\r\n");
for (P=S; P=strchr(P,'\r'); P++) strcpy(P,P+1);
printf("%s\n",S);
return 0;
}
Эта последовательность удаляет все \r
(возврат каретки) из входной строки. Я знаю (от Кернигама и Ритчи), что очень простая реализация для strcpy выглядит следующим образом:
while (*t++=*s++) ;
Теперь я скомпилировал свою программу, используя gcc (Gentoo 4.5.4 p1.0, pie-0.4.7) 4.5.4, и она печатает это:
abcdefghi
jklmnpqr <-- missing 'o'
stuvwxxyz <-- doubled 'x'
Я предполагаю, что этот компилятор (фактически его библиотека) использует очень сложную последовательность для strcpy
, и я не понимаю причину.
long long *
) и скопировать ее. Это означает, что копия перезаписывает то, что копируется. - person Some programmer dude   schedule 17.10.2012