Я пытаюсь использовать аргумент командной строки в Linux (Ubuntu) в c++. но он генерирует ошибку времени выполнения: segmentation fault.this эта программа работает без ошибок в окнах. Вот мой код
#include<iostream>
using namespace std;
int main(int argc , char **argv){
char **ss;
for(int i=0;i<argc;i++){
ss[i] = argv[i];
}
for(int i=0;i<argc ;i++)
cout<<ss[i];
return 0;
}
что не так с этим кодом. пожалуйста помогите. заранее спасибо.
Ваша программа имеет неопределенное поведение, потому что вы не инициализировали указатель ss
и не выделяли память, где вы собираетесь копировать элементы, указанные argv
char **ss; // What value does it have?
for(int i=0;i<argc;i++){
ss[i] = argv[i];
Вы можете сделать следующее
char **ss = new char *[argc];
for(int i=0;i<argc;i++){
ss[i] = argv[i];
Лучше всего использовать std::vector<std::string>
. В этом случае вы также можете скопировать не только указатели на аргументы, но и аргументы. Например
#include<iostream>
#include <vector>
#include <string>
int main(int argc , char **argv)
{
std::vector<std::string> v( argv, argv + argc );
for ( const std::string &s : v ) std::cout << s << std::endl;
return 0;
}
Если ваш компилятор не поддерживает диапазон, основанный на выражении, то вы можете его заменить
for ( std::vector<std::string>::size_type i = 0; i < v.size(); i++ )
{
std::cout << v[i] << std::endl;
}
Как уже было сказано, вы не выделили какую-либо память для ss
. Поскольку вы используете c++, а не c, вы должны иметь стандартную библиотеку c++ в вашем распоряжении:
std::vector<std::string> ss;
ss.reserve(argc); // not necessary
for(int i=0;i<argc;i++)
ss.push_back(argv[i]);
std::vector<std::string> ss(argv, argv + argc);
Используйте следующую декларацию для ss
#include<iostream>
using namespace std;
int main(int argc , char **argv){
char *ss[argc]; // <--allocate argc count of pointers
for(int i=0;i<argc;i++){
ss[i] = argv[i];
}
for(int i=0;i<argc ;i++)
cout<<ss[i];
return 0;
}
g++ -Wall -g
) и научиться использовать отладчикgdb
.