我正在编写命令行实用程序,但我找不到存储命令和参数的方法。到目前为止,我有以下内容,但我得到了分段错误:
int main(void)
{
char *command;
char *args[MAX_LINE/2 + 1];
int should_run = 1;
do{
cout << "cmd> ";
int counter = 0;
while(cin >> command) {
strcpy(args[counter],command);
counter++;
}
cout << args[0] << "\n";
}
}
答案 0 :(得分:4)
您会遇到分段错误,因为:
cin >> command
尝试写入未初始化的内存。由于这是C ++,你应该这样做:
std::string command;
而不是:
char * command;
,同样适用于args
。然后,您可以args[counter] = command
而不是使用strcpy()
。对于额外积分,请std::vector<std::string> args
而不是使用数组,而args.push_back(command)
代替args[counter] = command
。
例如:
#include <iostream>
#include <vector>
#include <string>
int main() {
std::string command;
std::vector<std::string> args;
std::cout << "cmd> ";
while( std::cin >> command ) {
args.push_back(command);
}
int i = 0;
for ( auto a : args ) {
std::cout << "Arg " << i++ << " is " << a << std::endl;
}
return 0;
}
输出:
paul@local:~/src/cpp/scratch$ ./args
cmd> test this command
Arg 0 is test
Arg 1 is this
Arg 2 is command
paul@local:~/src/cpp/scratch$
答案 1 :(得分:2)
一个常见的误解是char *
会在C或C ++中发挥特殊作用,主要是因为这是合法的:
char const * foo = "String";
实际上,char *
仍然只是指向char的指针,因此您需要在能够为其分配字符串文字之前分配内存。您的代码中有两次此问题:
char * command;
std::cin >> command;
和
char * arr[N];
std::strcpy(arr[k], command);
在C ++中,您应该使用std::string
和std::vector<std::string>
等容器。如果您坚持使用char数组,则可以确定静态最大长度:
char command[MAX_LENGTH];
char args[N][MAX_LENGTH];
或动态使用new[]
char * command = new char[MAX_LENGTH];
char * args[N];
for(unsigned k = 0; k < N; ++k) args[k] = new char[MAX_LENGTH];
然后你必须记得也要释放那个记忆:
delete[] command;
for(unsigned k = 0; k < N; ++k) delete[] args[k];
所以你应该更喜欢自动存储持续时间,除非你有充分的理由不这样做,因为你也应该有充分的理由不使用容器。
答案 2 :(得分:0)
本声明
while(cin >> command)
无效。首先,变量命令没有初始化,其次你必须分配流cin可以放置数据的内存。 使用字符数组(静态或动态分配)或使用类std :: string输入数据。