C / C ++ Указатели и массивы помогают - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть следующий код C ++, и я не могу заставить его работать.Я пытаюсь прочитать множество записей из командной строки, разделенных ('|') символами канала, а затем разделить получающиеся строки пробелами.

eg. 

mkdir C:/unixcode/shells|cd D:/margins/code | pwd| finger kobojunkie | last -l kobojunkie

но до сих пор я получаю ошибки, что-то не так при объявлении размера указателя:

Инициализатору не удается определить размер argv2 невозможно преобразовать char**char* для аргумента 1 char strtok(char*, const char*)

int main(int argc, char *argv[])
{
    char * pch;
    pch = strtok (argv,"|");
    //parse the contents of the generated arrays
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        char * argv2[] = pch;
        char * subpch = strtok(argv2," ");

        while (subpch !=NULL)
        {
            printf ("%s\n",subpch);
            subpch = strtok (NULL, " ");
        }
        pch = strtok (NULL, " ");
    }
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 18 сентября 2011

тип argv - char**, а не char*, следовательно, вы не можете передать его в strtok.Вместо этого используйте argv [1], но сначала убедитесь, что argc> = 2.

Или, поскольку это тег c ++, используйте stl для разделения строки, например,

void split( const std::string& s, char delim, std::vector<std::string>& elems )
{
  std::stringstream ss( s );
  std::string item;
  while( std::getline( ss, item, delim ) )
    if( !item.empty() )
      elems.push_back( item );
}

int main( int argc, char *argv[] )
{
  if( argc == 2 )
  {
    std::vector< std::string > elements;
    split( argv[ 1 ], '|', elements );
    //elements now contains all items..
  }
}
1 голос
/ 18 сентября 2011

Командная строка управляется программой: оболочкой (вероятно, cmd.exe в Windows или bash в Linux).Эта оболочка получает весь материал, записанный в командной строке, анализирует его и выполняет указанные команды.

Если вы не пишете оболочку, вы не сможете увидеть "|" вашей примерной командной строки внутри программты пишешь.Они эффективно обрабатываются из оболочки и удаляются из параметров, отправляемых в программы.

В

mkdir C:/unixcode/shells|cd D:/margins/code | pwd| finger kobojunkie | last -l kobojunkie

оболочка вызывает 5 следующих команд, каждая с указанными параметрами

  • mkdir C: / unixcode / shell
  • cd D: / поля / код
  • pwd
  • палец кобожунки
  • последний -l kobojunkie

Обратите внимание, что ни одна из программ не получит "|".


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

1 голос
/ 18 сентября 2011

argv - это массив массивов указателей.Вы не можете передать его как есть в strtok: вам нужно передать его элементы в цикле

for (k = 1; k < argc; k++) {
    pch = strtok(argv[k], "|");
    /* ... */
}

Также: вы уверены, что хотите разделить с помощью "|"?Этот символ имеет особое значение для оболочек и, как правило, не входит в вашу программу.Если вы не вызываете свою программу с их экранированием, например,

bash$ ./a.out 'one|two|three' 'four|five|six'
0 голосов
/ 18 сентября 2011

argv не является строкой. argv - это массив строк. strtok принимает строку, поэтому вы не можете передать ей массив строк и ожидать, что она сделает что-то значимое.

Каждый строковый элемент массива argv является отдельным параметром командной строки, за исключением первого, который является именем исполняемого файла. Итак, что вы должны делать, это просматривать каждую строковую запись на «|» и действовать соответственно.

...