Что не так с 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, что всегда ложно.

Другие вопросы по тегам