путаница в выводе C-программы для объединения двух строк - PullRequest
0 голосов
/ 25 октября 2018

Так что это мой код для добавления строки2 к строке 1. Код работает нормально, когда я добавил строку: s1[null_index]='\0';, но когда я пропускаю, он добавляет слово «дорога» еще раз к выводу ... почемутот?Почему я должен указать, что окончательное значение null_index variabe равно '\0' .... Разве компьютер не должен знать об этом, поскольку это происходит, когда я объявляю и назначаю в начале?

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
char s2[]="a lonely road";
char s1[]="Success is ";
    int l=strlen(s1);
    int null_index=l,i=0;
while(s2[i]!='\0')
{

s1[null_index]=s2[i];
i++;
null_index++;
}
s1[null_index]='\0'; 
printf("%s",s1);
}

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

s1 выделяется только столько памяти, сколько требуется Success is, и когда вы пытаетесь выполнить s1[null_index]=s2[i];, вы вызываете неопределенное поведение.

0 голосов
/ 25 октября 2018

Для начала

char s2[]="a lonely road";
char s1[]="Success is ";

Объявляет s2 с размером 14 и s1 с размером 12. Следовательно, когда вы пишете символы от 12 до s1, вы вызываете неопределенное поведение.

Измените его на.

char s1[100]="Success is ";

Чтобы ответить на ваш вопрос.

В c строки имеют нулевое значение (\0), прерванные по определению.Следовательно, printf будет искать \0 в предоставленной строке, чтобы завершить печать string.

Если string не содержит символ \0, он будет продолжать печатать символы дов конечном итоге он вызывает неопределенное поведение.

0 голосов
/ 25 октября 2018

Проблема в том, что ваши массивы имеют фиксированный размер.После инициализации любое индексирование за пределами нулевого терминатора выходит за пределы и приводит к неопределенному поведению .

Если вы хотите добавить к s1, тогда вынужно явно установить размер массива, размер которого соответствует обеим строкам (плюс терминатор).

И когда вы добавляете к s1, на самой первой итерации вашего цикла вы перезаписываете терминатор.Поскольку вы не копируете терминатор из s2, вам необходимо явно установить терминатор s1 в соответствующем месте.

...