C/C++指针和数组帮助

C/C++ Pointers and Arrays help

本文关键字:数组 帮助 指针 C++      更新时间:2023-10-16

我有下面的C++代码,但我似乎无法让它工作。我要做的是从命令行中读取许多条目,这些条目由('|'(管道字符分隔,然后用空格分隔得到的字符串。

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

但到目前为止,我遇到了一些错误,比如关于声明指针的大小:

初始化程序无法确定argv2的大小无法将参数1的char**转换为char*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 ("%sn",pch);
        char * argv2[] = pch;
        char * subpch = strtok(argv2," ");
        while (subpch !=NULL)
        {
            printf ("%sn",subpch);
            subpch = strtok (NULL, " ");
        }
        pch = strtok (NULL, " ");
    }
    return 0;
}

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..
  }
}
命令行由一个程序管理:shell(可能是Windows中的cmd.exe或Linux中的bash(。该shell获取在命令行中编写的所有内容,并对其进行解析并执行指定的命令。

除非您正在编写shell,否则您永远无法在编写的程序中看到示例命令行的"|"。它们从shell中得到有效处理,并从发送到程序的参数中删除。

在中

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

shell调用以下5个命令,每个命令都具有指定的参数

  • mkdir C:/unixcode/shells
  • cd D:/parings/code
  • pwd
  • 手指吸毒者
  • 最后一次吸毒

请注意,没有任何程序接收到"|"


如果您确实在编写shell,那么命令行在argv数组中不可用。这取决于您在shell中管理输入的方式。

argv数组指针的数组。您不能按原样将其传递给strtok:您需要在循环中传递其元素

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

另外:您确定要使用"|"进行分隔吗?这个字符对shell有特殊的意义,通常不会出现在程序中。除非你调用你的程序,否则他们逃跑了,例如

bash$ ./a.out 'one|two|three' 'four|five|six'

argv不是字符串。argv是字符串的数组strtok接受一个字符串,因此您不能向它传递一个字符串数组并期望它做一些有意义的事情。

argv数组的每个字符串元素都是一个单独的命令行参数,除了第一个是可执行文件的名称。因此,您应该做的是在每个字符串条目中查找"|",并采取相应的行动。