#c
#c
Вопрос:
Я пытаюсь объединить две строки. Я получаю ошибку сегментации, когда я передаю NULL в S1 и / или S2. Я полагал, что это как-то связано со строкой 19 при отладке, но я не могу понять это из-за моей неопытности.
char *string_nconcat(char *s1, char *s2, unsigned int n)
{
char *p1 = s1, *p2 = s2;
unsigned int L1 = 0, L2 = 0, c = 0;
char *cstr, *dest;
if (s1 == NULL)
s1 = "";
if (s2 == NULL)
s2 = "";
while (*p1 != 0)
p1 , L1 ;
while (*p2 != 0)
p2 ; L2 ;
if (n >= L2)
cstr = malloc((L1 L2 1) * sizeof(char));
else
cstr = malloc((L1 n 1) * sizeof(char));
p1 = s1, p2 = s2, dest = cstr;
if (cstr == NULL)
return (NULL);
while (*p1 != '')
{
*dest = *p1;
dest ;
p1 ;
}
while (*p2 != '' amp;amp; c < n)
{
*dest = *p2;
dest ;
p2 ;
c ;
}
*dest = '';
return (cstr);
}
Комментарии:
1. можете ли вы скопировать копию без номера строк, из-за чего другим будет сложно помочь вам
2. Вы скопировали
NULL
вp1
илиp2
, прежде чем проверять, является лиs1
илиs2
NULL
.3. Когда
s1
естьNULL
, тоwhile (*p1 != 0)
такжеp1
естьNULL
(потому что у вас естьchar *p1 = s1
), поэтому вы разыменовываетеNULL
указатель.4. atSpinkoo удален, мои извинения. @user3386109 Это сработало! Так была бы причина ошибки сегментации в том, что я установил пустую строку после того, как пытался получить доступ к null?
5. C является императивным языком . Следовательно, он выполняет действия в указанном вами порядке. Присваивание
p1 = s1
выполняется перед присваиваниемs1 = ""
. Следовательно, еслиs1
изначально равно NULL, тоp1
будет NULL иs1
будет указывать на пустую строку. Когда вы проверяете условие*p1 != 0
, вы получите ошибку сегментации, потому что вы разыменовываете нулевой указатель.
Ответ №1:
Когда вы обнаруживаете, что вам передано значение NULL, вы устанавливаете s1
or s2
в пустую строку, но это не меняет того, на что указывают p1
/ p2
, поэтому, когда вы пытаетесь использовать их позже, они по-прежнему указывают на NULL.
Ответ №2:
Добавить *p1 = s1, *p2 = s2;
через ssecond while