2016-04-05 2 views
-2

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

Например, человек вводит 4.3, 5, 99, 0.1, w, 4, 2.43. Правильно, когда петля обнаружит символ w, он выведет «Ошибка». То же самое происходит, если входной сигнал 4.3, 5, 99, 0.1, wasabi, 4, 2.43; когда петля обнаруживает строку wasabi, она выведет сообщение об ошибке. Дело в том, что я не могу понять, как написать цикл так, чтобы он обнаруживал ANY char или string, независимо от того, где он находится в массиве. Это то, что у меня есть до сих пор:

//check for a string or char in array 
void checkForWord(int argc, char* argv[]) 
{ 
    for (int i = 1; i < argc - 1; i++) 
    { 
     if() 
     { 
      //do something.. 
     } 
    } 
} 

Любая помощь была бы очень признательна !!

+0

Ну, все 'argv' записями являются строками по определению. Я думаю, вы на самом деле имеете в виду, может ли строка быть проанализирована как число. Предполагая, что вы хотите проанализировать их как 'float', тогда используйте что-то вроде [' strtof'] (http://linux.die.net/man/3/strtof) для каждой строки 'argv'. Возвращаемое значение и возвращаемые параметры 'strtof' могут сказать вам, было ли оно успешно преобразовано и, следовательно, действительный float или нет. – kaylum

+0

Вы хотите, чтобы ваш ответ на C или C++? Они будут разными. Выберите тот или другой. – kfsone

+0

C++ пожалуйста. Я пытаюсь получить цикл for, но с небольшой удачей. –

ответ

0

Здесь вы идете. Полный рабочий пример:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <sstream> 

int main(int argc, const char* const* argv) 
{ 
    // first, concatenate the command line arguments into a continuous buffer 
    std::string buffer; 
    auto sep = ""; 
    for(int i = 1 ; i < argc ; ++i) 
    { 
     buffer += sep; 
     buffer += argv[i]; 
     sep = " "; 
    } 

    // now turn the buffer into a string stream 
    auto stream = std::istringstream(buffer); 

    // now stream in my numbers, delimited by commas 
    std::string val_buffer; 
    while (std::getline(stream, val_buffer, ',')) 
    { 
     // make a new string stream, just to parse the text into a number 
     auto num_stream = std::istringstream(val_buffer); 
     double val = 0; 
     if (num_stream >> val) 
     { 
      // parsed correctly. now let's do something with it 
      std::cout << "found a value: " << val << std::endl; 
     } 
     else 
     { 
      // whatever that was, it wasn't a number 
      std::cout << "found a something I didn't like: " << val_buffer << std::endl; 
      break; 
     } 
    } 

    if (stream.bad()) 
    { 
     std::cout << "something bad happened" << std::endl; 
    } 
    return 0; 
} 

результатов при выполнении с командной строкой 4.3, 5, 99, 0.1, wasabi, 4, 2.43:

found a value: 4.3 
found a value: 5 
found a value: 99 
found a value: 0.1 
found a something I didn't like: wasabi 

результатов без васаби:

found a value: 4.3 
found a value: 5 
found a value: 99 
found a value: 0.1 
found a value: 4 
found a value: 2.43 
+0

Можете ли вы объяснить, где выполняется фактическая проверка? Я не совсем понимаю этот процесс. –

+0

@yurtmama num_stream >> val пытается проанализировать число в val. Если он терпит неудачу, он устанавливает failbit в потоке. Объект stream имеет оператор преобразования bool, поэтому вы можете использовать его в выражении if. Он, если оценивает значение true, не записывается с ошибкой. Если поток оценивается как false, это означает, что он не сработал с чем-то (в этом случае, разобрав число) –

+0

Любой способ опубликовать обновленный код, который «затуманен» сам по себе? .. Я новичок в C++, поэтому ваш код довольно запутанный для меня –

0

Может быть что-то вроде:

for (int i = 1; i < argc; i++) // Don't do argc - 1 when using < 
{ 
    string s = argv[i]; 
    for (auto c : s) 
    { 
     if (c != ',' && c != '.' && !isdigit(c)) 
     { 
      cout << "Error" << endl; 
      return; 
     } 
    } 
} 

Примечание: Это будет принимать ввод как 4....3,,,,, 5, 99, 0.1, 4, 2.43 как код не проверяет количество . и количество ,

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