2013-10-27 3 views
1

Я пишу функцию/метод в C, который должен сделать следующее:Указатели и строка манипуляции

/** * Recieves списка аргументов и копии ConfFile от имени показателей * Файл конфигурации. * Возвращает 1, если используется имя файла по умолчанию или 2, если * параметр -f существует, и поэтому используется указанное имя . Возвращает 0, если есть параметр -f * , но недействителен. (Последний аргумент)
*/

В основном один из этих двух вариант будет "вопрос" по программе:

1- контроллер -f FCFS | Look

2- контроллер Fcfs | LOOK

Если второе задано, мы вводим случай использования имени по умолчанию.

int get_conf_name(char* argv[], char* conffile) { 

// Searches for -f 

s = strstr(*argv, "-f"); 


if(s != NULL){ 

     if(//its valid){ 
strcpy(conffile, //the name of the file which comes after -f 

return 2 

} 

     else return 0 

} 

else{ 

strcpy(confile, "config.vss") 

return 1 

} 

} 

Проблема в том, как получить слово после -f и скопировать его в файл confile? И могу ли я получить доступ к argv так же, как я получаю доступ к conffile, так как один из них является массивом? Я думал об использовании цикла for и strlen, но для этого было бы много ненужной работы для компьютера, не так ли?

+0

Это не так, как работает 'strstr'. 'strstr' ищет подстроку (иглу) в другой строке (стог сена). Вместо этого вы ищете целую строку в массиве строк. Вы должны использовать цикл. –

+0

btw: опции «переданы» (не «заданы») программой. Если вы не обращаетесь к программе вызывающего абонента. –

+0

@Giulio Franco О спасибо: D Поинтересовался, что я имею в виду, что есть две возможности для того, чтобы пользователь мог запросить программу – BVCGAAV

ответ

3

Я думаю, что задание ожидает, что вы пройдете через отдельные аргументы один за другим, сравнив их с "-f".

  • Если вы не видите -f, вы знаете, что файл по умолчанию должен быть использован
  • Если вы видите флаг в конечной позиции, вы знаете, что -f недействителен
  • Если вы видите флаг в положении k, то имя файла будет в argv[k+1]

скелет вашей программы должен выглядеть следующим образом:

bool foundFlag = false; 
for (int i = 1 ; i < argc ; i++) { 
    if (strcmp(argv[i], "-f") == 0) { 
     if (i == argc-1) { 
      // Error 
     } else { 
      // argv[i+1] is the file name; 
     } 
     foundFlag = true; 
     break; 
    } 
} 
if (!foundFlag) { 
    // Default name is used 
} 
+0

Спасибо, скелет очень чистый и понятный: D Итак, теперь я могу использовать argv [i + 1] прямо на strcpy правильно? Но не будет ли [i + 1] указывать на пространство вместо первого символа имени? – BVCGAAV

+0

@ ipg24 Вот что - пробелы и вкладки вынимаются из исходной командной строки, когда она символизирована. Сохраняются только символы без пробелов. – dasblinkenlight

+0

Понял :) Спасибо большое, теперь я знаю, как структурировать и написать все это! – BVCGAAV

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