В чем разница между этим l oop с использованием скобок массива и обозначения указателя в C? - PullRequest
1 голос
/ 23 марта 2020

На языке программирования C у меня есть следующий код:

void rm_newline(char input[])
{
    assert(input);
    size_t i;
    for(i = 0; input[i] != '\0'; ++i)
    {
        if(input[i] == '\n') input[i] = '\0';
    }
    return;
}

Этот код работает так, как задумано, заменяя символ '\ n' на '\ 0'. Однако у меня была предыдущая версия, показанная ниже:

void rm_newline(char input[])
{
    assert(input);
    char *input_ptr = input;
    while(*input_ptr != '\0')
    {
        if(*input_ptr++ == '\n')
        {
            *input_ptr = '\0';
        }
    }
    return;
}

Этот второй код неправильно заменял '\ n' на '\ 0', но я не уверен почему. Кто-нибудь может объяснить, чем второй код функционально отличается от первого кода?

1 Ответ

2 голосов
/ 23 марта 2020

Во втором случае

 if(*input_ptr++ == '\n')

input_ptr увеличивается до выполнения тела условия. Вы должны увеличить после завершения замены, что-то вроде

while(*input_ptr != '\0')
{
    if(*input_ptr == '\n')
    {
        *input_ptr = '\0';  
    }
     input_ptr++; // do the increment here
}
...