Ложные новые строки пробелы при печати подстрок в C

#c

#c

Вопрос:

У меня есть простая программа, которая считывает пару символов из char[] массива и выводит каждую пару на консоль, все в одной строке — по какой-то причине к выводу добавляются некоторые ложные новые строки (и пробелы).

Я удалил использование библиотек str (кроме strlen ), которые могут добавлять новые строки в конце строк, но я все еще не понимаю, что происходит.

Программа:

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

char input[] = "aabbaabbaabbaabbaabb";

int main() {
    int i;
    char c[2];

    size_t input_length = strlen(input);

    for (i=0; i<input_length; i =2) {
        c[0] = input[i];
        c[1] = input[i 1];
        
        printf("%s", c);
    }

    printf("n");

    return 0;
}
  

Ожидаемый результат:

 aabbaabbabbaabbaabb
  

Вывод:

 aabbaabbabb
aa
  bbaabb
  

Почему в выходных данных есть новые строки и пробелы? (Обратите внимание, что в 1-й строке a в конце есть один — не удалось определить, почему)

Использование Apple clang версии 11.0.0 (clang-1100.0.33.16), хотя я сомневаюсь, имеет ли это значение.

Комментарии:

1. Вы забыли завершить нулевым завершением c . Измените его на char c[3]; и установите c[2] = ''; Без этого %s формат будет выполняться до конца c и начнет пытаться печатать все, с чем он столкнется.

Ответ №1:

%s работает правильно, если ваша строка содержит нулевой символ ( '' ) . Если это не так (как в вашем случае), то printf функция продолжает печатать символы, пока не найдет '' где-нибудь в памяти. Помните, что string в C последовательность символов заканчивается '' . Это причина, по которой ваш код ведет себя не так, как вы ожидали.

С другой стороны, %c печатается только один символ, поэтому вы можете использовать:

 printf("%c%c", c[0],c[1]);
  

Если вы продолжаете использовать %s , в этом случае вам придется использовать %.2s . Вы, наверное, уже знаете, что . это показывает точность в C. Точность в string означает максимальное количество символов, которые вы хотите напечатать. Таким образом, использование .2 результатов приводит к печати первых двух символов в вашей строке. Не нужно ждать '' !

 printf("%.2s", c);
  

Я также даю решение @Tom Karzes. Вы должны изменить и добавить эти строки:

 char c[3];
c[2] = '';