Что не так с printf в моем коде strcat?
Я сделал эту программу для эмуляции функциональности strcat, но есть ошибка с printf, которую я не понимаю...
Вот код:
#include <stdio.h>
char *mystrcat(char *s1, char *s2);
int main(void)
{
char *s1,*s2;
s1="asdad";
s2="asdad";
s1=mystrcat(s1,s2);
printf(s1);
return 0;
}
char *mystrcat(char *s1,char *s2)
{
int i,j;
for(i=0;s1[i]<'\0';i++) ;
for(j=0;s2[j]!='\0';j++) s1[i+j]=s2[j];
s1[i+j]='\0';
return s1;
}
2 ответа
Первая проблема заключается в том, что s1
не хватает места для добавления s2
к этому. Вам нужен размер буфера, на который указывает s1
быть хотя бы strlen(s1) + strlen(s2) + 1
(+ 1
будучи NUL-терминатором).
Вторая проблема заключается в том, что строковые литералы доступны только для чтения. Вы назначаете s1
от "asdad"
, который создает указатель на (потенциально) постоянную память. Конечно, первая проблема означает, что у вас не будет достаточно места, чтобы добавить к концу, даже если бы он был записываемым, но это одна из распространенных ошибок в C и стоит упомянуть.
Третья проблема (уже упоминавшаяся в другом ответе) состоит в том, что сравнение s1[i] < '\0'
неправильно, и вы не сможете правильно найти длину s1
поскольку цикл не запустится ни одной итерации. Правильное условие такое же, как во втором цикле, != '\0'
, (Это маскирует проблему 1 с тех пор, как вы случайно перезаписали s1
с начала.)
По крайней мере, s1[i] < '\0'
такой же как s1[i] < 0
, что всегда ложно.