2015-09-26 4 views
0

Я передаю строку, например, «а \ п» к программе, которая хранит в строке в буфере, а затем печати, что было принят вC - « п» символ не печатает новую строку

. Как это:

int main(int argc, char **argv) { 
    char buffer[5]; 
    strncpy(buffer, argv[1], 5); 
    printf("%s", buffer); 

    return 0; 
} 

Мой аргумент, то это: "abc\n"

Но тогда строка, которая печатает это: abc\n

Как же не добавить новая строка после abc?

ответ

2

Причина, по которой он печатает abc\n, заключается в том, что оболочка не выполняет экранирование в стиле С, то есть \n в оболочке не является экранированной новой строкой. И то, что создает оболочка, является тем, что передается в качестве аргумента main в вашей программе на C.

char * str = "abc"; просто не имеет такого же поведения, как foo abc\n в терминале оболочки. Первый задается стандартом C, а последний может варьироваться от оболочки к оболочке.

Как именно это исправить, зависит от вашей платформы и оболочки, которую вы используете, и это не вопрос C.

Возможно, вы захотите объяснить, что именно вы пытаетесь сделать, а затем вы можете рассмотреть, нужно ли вручную реализовать определенные комбинации escape-символов или использовать другой метод ввода.

Вот пример кода на coliru: http://coliru.stacked-crooked.com/a/111f9fdd28219f88

(Вот код и командная строка :)

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

int main(int argc, char **argv) { 
    char buffer[5]; 
    strncpy(buffer, argv[1], 5); 
    printf("%s", buffer); 

    return 0; 
} 

г ++ -O3 -std = C++ 11 -Wall -Werror главное. каст & & ./a.out "ASD \ п"

ASD \ п

+0

Я вижу спасибо. Я использую компилятор GCC, я думаю, что моя оболочка не bash, а обычная sh. – Kingamere

+3

@ Икшваку: Не имеет значения - ни bash, ни обычный sh не интерпретируют обратную косую черту ('\') в строках. поэтому '\ n' будет два символа. Вне цитат '' 'имеет особое значение для оболочки, но не то же самое, что и в строках C, поэтому он тоже не будет работать. Тем не менее, вы можете включить фактические строки в строках в sh и bash - введите './a.out" asd' и нажмите enter, и вы получите приглашение на продолжение (обычно '>'), и вы можете ввести больше текста для ту же команду. Введите '' 'и нажмите enter сейчас, и он вызовет вашу программу с новой строкой в ​​аргументе. –

+0

Примечание; 'strncpy (buffer," abc \\ n ", 5); printf ("% s", buffer); 'UB, поскольку' buffer' не имеет нулевого символа. – chux

1

Когда вы передаете «abc \ n» из командной строки, вы передаете литерал «\», за которым следует буква «n», что вы делаете.

При определении строки в программе, как

char *myString = "abc\n"; 

В «\ п» преобразуется в символ новой строки во время компиляции.

Смежные вопросы