Ненужные символы новой строки с использованием функции printf

При размещении строк в куче (с помощью 'malloc'),
и их инициализации стандартным вводом (с помощью 'fgets)
между ними появляется ненужная новая строка при попытке их распечатать (с помощью' printf 'и% s форматирование).
например:

main()
{
    char *heap1;
    char *heap2;

    heap1=malloc(10);
    heap2=malloc(10);
    fgets(heap1,10,stdin);
    fgets(heap2,10,stdin);
    printf("%s%s",heap1,heap2);
}

при вводе «hi1 \ nhi2» выдает «hi1 \ nhi2». скомпилирован с использованием gcc 4.3.4 для Debian.


person Community    schedule 18.02.2010    source источник
comment
Из магазина приманок: то, что результат действительно "hi1\nhi2\n", является хорошей подсказкой (обратите внимание, что в вашем тестовом примере нет явной новой строки). По возможности используйте массивы в стеке (здесь не нужно выполнять malloc); ваша жизнь станет проще.   -  person    schedule 19.02.2010
comment
С другой стороны, маловероятно, но возможно, что вы создали несоответствующий текстовый файл для ввода, в котором была строка без завершающей новой строки, и получили результат точно так, как указано. В таком случае: не делайте этого! Все строки должны заканчиваться символами новой строки. :)   -  person    schedule 19.02.2010


Ответы (3)


fgets также читает символ '\ n' (новая строка). Вам следует удалить его, если вы не хотите, чтобы он печатался так.

heap1[strlen(heap1) - 1] = '\0';

после прочтения содержимого heap1.

person IVlad    schedule 18.02.2010
comment
Если длина строки ввода на 9 символов больше, то последний символ из нее будет автоматически удален. Лучше использовать strrchr(). - person Alok Singhal; 19.02.2010
comment
Правда. Если вы не уверены, что длина строки не приведет к этому, либо используйте strrchr (), либо проверьте, действительно ли heap1 [strlen (heap1) - 1] является новой строкой. - person IVlad; 19.02.2010

fgets возвращает новую строку как часть строки.

См. Man 3 fgets. Конкретно:

fgets () считывает из потока не более одного символа меньшего, чем размер, и сохраняет их в буфер, на который указывает s. Чтение останавливается после
EOF или новой строки. Если читается новая строка, она сохраняется в буфере. '\ 0' сохраняется после последнего символа в буфере.

person Kyle Butt    schedule 18.02.2010

fgets, вероятно, добавляет новую строку. Попробуйте обрезать строку, возвращаемую из fgets.

person slim    schedule 18.02.2010