2016-08-27 5 views
3

Я борюсь с принятием имени аргумента и передачей его вместе с программой, которую я создал. Я сделал C-код (copy.c), который принимает имя файла и печатает на консольном терминале Linux. Если говорить легко, это работает, когда я это делаю:Передача аргументов в main в c

./copy filename.txt 

Это прекрасно работает, как и кошка.

Однако, это не когда я ставлю:

./copy < filename.txt 

Так я понял, что «<» должен прерывать копию, чтобы взять в следующем аргументе, который является фактическим именем файла. Я пытался обойти это, сначала сделав основной, чтобы принять «< filename.txt» до первого аргумента в целом, а затем изменить его на «filename.txt»

Есть ли способ обойти это? Если это «123 filename.txt», это работает.

Вот мой copy.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
//#include <string.h> 
#define bufferSize 200 

int main(int argc, char* argv[]) 
{ 
    char buffer[bufferSize]; 
    int fd; 
    int argu_no = 1; 

    printf("%s %s\n\n", argv[0], argv[1]); //check for the argument names 
    return 0; 
} 

И когда я "./copy 123 filename.txt":

123 filename.txt 

появляется.

Но когда я "./copy < filename.txt"

(null) XDG_SESSION_ID=2231 

выходит. Пожалуйста, помогите мне в программе принять все «< filename.txt» в качестве первого аргумента или обойти это.

Я использую библиотеку GNU для Linux для программирования на языке C.

+0

'./copy" <"filename.txt" ' –

+0

Я пытаюсь сделать copy.c для принятия аргумента, который не начинается с двойных кавычек, как вы предложили. –

+0

Кавычки не будут переданы в аргументы. Если вы хотите явно передать кавычки, вам придется избегать их с обратной косой чертой. –

ответ

7

Оболочка интерпретирует:

./copy < filename.txt 

и лечит < и filename.txt как инструкции для установки стандартного ввода в имени файла, и они не передаются в качестве аргументов программы. Таким образом, этот вызов запускает ./copy без дополнительных аргументов (и со стандартным входом, поступающим из файла вместо вашего терминала).

Если вы хотите < передается в качестве аргумента (и имя файла тоже), цитирую его:

./copy '<' filename.txt 
./copy "<" filename.txt 
./copy \< filename.txt 

Если есть пробелы в имени файла, вам нужно процитировать, что тоже.

+0

Спасибо, это помогло! –

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

  • Нет связанных вопросов^_^