Причина, по которой он печатает 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 \ п
Я вижу спасибо. Я использую компилятор GCC, я думаю, что моя оболочка не bash, а обычная sh. – Kingamere
@ Икшваку: Не имеет значения - ни bash, ни обычный sh не интерпретируют обратную косую черту ('\') в строках. поэтому '\ n' будет два символа. Вне цитат '' 'имеет особое значение для оболочки, но не то же самое, что и в строках C, поэтому он тоже не будет работать. Тем не менее, вы можете включить фактические строки в строках в sh и bash - введите './a.out" asd' и нажмите enter, и вы получите приглашение на продолжение (обычно '>'), и вы можете ввести больше текста для ту же команду. Введите '' 'и нажмите enter сейчас, и он вызовет вашу программу с новой строкой в аргументе. –
Примечание; 'strncpy (buffer," abc \\ n ", 5); printf ("% s", buffer); 'UB, поскольку' buffer' не имеет нулевого символа. – chux