как обрабатывать указатель для цикла - PullRequest
0 голосов
/ 25 апреля 2019

При этом выбрасывается идентификатор ошибки, возвращается 1 статус ошибки. Цикл работает, но я не могу напечатать окончательную объединенную строку. Когда я пытаюсь напечатать окончательную строку, она ничего не делает.

char str1[50], str2[50], str[100];
char *p1, *p2, *p3;
int i = 0, j = 0;

p1 = &str1[0];
p2 = &str2[0];
p3 = &str[0];

printf("enter a string:");
gets(str1);

printf("enter a string:");
gets(str2);

while (i <= strlen(str1) + strlen(str2)) {
    if (i != strlen(str1)) {
        *(p3 + i) = *(p1 + i);
        i++;
    } else {
        *(p3 + i) = *(p2 + j);
        j++;
    }

1 Ответ

1 голос
/ 25 апреля 2019

Эта проверка здесь неверна:

if(i!=strlen(str1))

Когда i больше strlen(str1), оно снова станет ложным, но предполагается, что оно останется верным. Измените это на это:

if (i < strlen(str1))

Кроме того, вы не увеличиваете i в блоке else. Это приведет к бесконечному циклу с постоянно растущим j, по крайней мере до тех пор, пока неопределенное поведение не приведет к выходу вашей программы, возможно, из-за нарушения прав доступа. Попробуйте вместо этого:

else {
    *(p3 + i) = *(p2 + j);
    i++; // increase i in both cases
    j++;
}

Или, еще лучше, сделайте это безоговорочным. Например, вы можете извлечь i++ из тела, изменив цикл следующим образом:

for (i = 0; i <= strlen(str1) + strlen(str2); i++)

Кроме того, могу ли я вас заинтересовать в записи индекса массива? Вместо этого:

if (i < strlen(str1)) {
    *(p3 + i) = *(p1 + i);
}

Сделайте это:

if (i < strlen(str1)) {
    p3[i] = p1[i];
}

Так будет намного чище, и люди, которые будут работать с вашим кодом, это оценят.

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