Печать CString печатает неизвестный текст раньше - PullRequest
0 голосов
/ 13 февраля 2019

К сожалению, этот Код, похоже, печатает что-то до того, как печатает фактический текст.Что это?И почему он напечатан?

"\ 300 \ 367 \ 277 \ 357 \ 376"

Я чаще всего это осознавал в своем коде, и я уверен, что это означает, что я сделал что-то не так.

char* concat(const char *s1, const char *s2);
int main(int argv, char* args[]){
    char lastchars[50];
    char *buf;
    while(1){
        gets(lastchars);
        if(strlen(lastchars) == 0)break;
        buf = concat(buf, lastchars);
    }
    printf("%s",buf);
 }
 char* concat(const char *s1, const char *s2)
 {
    char *result = malloc(strlen(s1) + strlen(s2) + 1); 
    strcpy(result, s1);
    strcat(result, s2);
    return result;
 }

1 Ответ

0 голосов
/ 13 февраля 2019

Даже если мы посмотрим на вызов небезопасной и более не поддерживаемой функции gets, с этим кодом возникнут многочисленные проблемы, начиная с вашей concat функции:

char* concat(const char *s1, const char *s2)
{
   char *result = malloc(strlen(s1) + strlen(s2) + 1); 
   strcpy(result, s1);
   strcat(result, s2);
   return result;
}

Вы звонитеconcat со строкой: buf = concat(buf, lastchars);, когда buf не инициализирован.Другими словами:

char *result = malloc(strlen(buf) + strlen(lastwords) + 1);
strcpy(result, buf);
strcat(result, lastwords);
return result;

Что такое strlen(buf)?Это неопределенное поведение, так как buf не содержит строку с нулевым символом конца.

Тогда strcpy(result, buf) также является неопределенным поведением, поскольку buf не инициализируется.

Затем вы возвращаете result и присваиваете его обратно в buf.

Очень трудно расшифровать ваше намерение с помощью этого кода, поэтому я не могу предложить решение - только укажите на многочисленные проблемы.

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