Конкатенация строк в C. newline в выводе - PullRequest
2 голосов
/ 03 октября 2019

У меня странная проблема, когда вывод конкатенации идет с новой строкой между каждым вводом строки. Я пробовал пару разных вещей, например. удаление динамического выделения памяти, копирование строк друг в друга, а затем конкатенация. та же проблема есть. есть идеи почему?

Ввод:

> one
> two

Ввод:

> Result of concatenation: one
> two

вот код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char const *argv[])
{
    /* code */

    char string1[100];
    char string2[100];
    char *concat;

    fgets(string1,100,stdin);
    fgets(string2,100,stdin);

    unsigned int size = strlen(string1) + strlen(string2);

    concat = (char *) malloc(sizeof(char) * size);

    if (concat==NULL)
    {
        exit(0); 
    }

    strcat(concat,string1);
    strcat(concat,string2);

    printf("Result of concatenation: %s",concat);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Для начала функция fgets может добавить символ новой строки к введенным строкам. Вы должны удалить это. Например,

fgets(string1,100,stdin);
string1[ strcspn( string1, "\n" ) ] = '\0';
fgets(string2,100,stdin);
string2[ strcspn( string2, "\n" ) ] = '\0';

Во-вторых, вы забыли о завершающем ноле, когда выделяли память. Вместо

unsigned int size = strlen(string1) + strlen(string2);

Вы должны написать

size_t size = strlen(string1) + strlen(string2) + 1;

Более того, выделенная память не инициализируется. Вы должны написать

concat[0] = '\0';

перед этими утверждениями

strcat(concat,string1);
strcat(concat,string2);

И не забудьте освободить выделенную память.

free( concat );
0 голосов
/ 03 октября 2019

со страницы руководства :

char *fgets(char *restrict s, int n, FILE *restrict stream);

...

Функция fgets() считывает байты изпоток в массив, на который указывает s, до считывания n−1 байтов, или <newline>, считывания и переноса в s, или до условия конца файла. Затем строка заканчивается нулевым байтом.

Скорее всего, вы включили \n (символы новой строки), считанные fgets, в свой объединенный массив символов.

...