ошибка сегментации при вставке в набор - PullRequest
1 голос
/ 10 января 2012

Я написал пример программы:

#include<iostream>
#include<set>
#include<conio.h>
using namespace std;
int main()
{
    set<int> myset[4];
    char *str[4]={"1-2-3-4","3-4-34-3","7-45-35-3","67-45466-3633-3"};

    for(int i=0;i<4;i++)
    {
     char *data;
     strcpy(data,str[i]);
     char *pch;
      pch = strtok (data,"-");
              for(int j=0;pch != NULL&&j<4;j++)
              {
               myset[j].insert((int)strtol(pch, NULL, 10));
               pch = strtok (NULL, "-");
              }
    }  

getch();
return 0;   
}

Эта программа выдает ошибку сегментации на

myset[j].insert((int)strtol(pch, NULL, 10));

Может кто-нибудь сказать мне, почему?

Ответы [ 4 ]

6 голосов
/ 10 января 2012
char *data;
strcpy(data,str[i]);

Пытается скопировать данные в нераспределенный указатель и вызывает Неопределенное поведение .
Ваш указатель должен указывать на выделенную память, достаточно большую для хранения данных, в которые вы собираетесь скопировать данныеЭто.

Идеальное решение - использовать std::string и забыть char * при программировании на C ++.

1 голос
/ 10 января 2012

Поскольку вы копируете строку, чтобы изменить ее с помощью strtok, вам нужно будет использовать std::vector<char>

Однако strtok не идеальный способ токенизировать вашу строку, и я бы предложил изменить стратегию.

Вы можете, например, использовать istringstream для токенизации строки, что позволит вам читать непосредственно в целое число и затем читать разделитель в вашем цикле, пока вы не достигнете конца строки.

boost::tokenize сделает большую часть этой работы для вас, и вы можете рассмотреть возможность ее использования.

Кстати, хотя он все еще компилируется, чтобы не нарушать унаследованный код, вы никогда не должны назначатьбуквально до char*, но используйте const char *.В этом случае вы не предпринимаете никаких попыток изменить их.

1 голос
/ 10 января 2012

Должно появиться segfault там:

char *data;
     strcpy(data,str[i]);

Поскольку вы копируете Данные в место, которое вы не разместили! Если вам нравится делать это "c-way", вы должны использовать malloc.

Или вы не используете char*, вместо std::string! (и string.c_str (), если вам нужен символ *)

1 голос
/ 10 января 2012

Вы должны выделить данные, чтобы иметь возможность хранить скопированную строку:

 char *data; //unallocated
 strcpy(data,str[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...