2016-04-09 3 views
0

Я новичок в программировании на C++, и я пытаюсь учиться. В настоящее время я работаю над программой, которая читает из файла, который имеет в строках строки строку, за которой следуют 3 целых числа.Ошибка сегментации C++, связанная с выражением atoi

Пример: (Это первый набор данных, есть девять других в том же формате, как показано ниже)

Linus too good 
100 
23 
210 

Строки хранятся в массиве 1D в то время как целые числа хранятся в 2D массив.

До сих пор у меня есть это:

#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

void FileToArray(); 

using namespace std; 

int main() 
{ 
    FileToArray(); 

    return 0; 
} 

void FileToArray() 
{ 
    ifstream inFile; 

    inFile.open("bowlers2.txt"); 

    const int STRING_ARRAY_SIZE = 10; 
    const int NUM_ROW_SIZE = 3; 
    const int NUM_COL_SIZE = 10; 

    double scores[NUM_ROW_SIZE][NUM_COL_SIZE]; 
    string names[STRING_ARRAY_SIZE]; 
    string mystring; 

    for(int r = 0; r < 10; r++) 
    { 
     getline(inFile, names[r]); 

     for(int c = 0; c < 3; c++) 
     { 
      getline(inFile, mystring); 
      scores[r][c] = atoi(mystring.c_str()); 
     } 
    } 
    cout << "The names are:\n"; 
    for (int i = 0; i < STRING_ARRAY_SIZE; i++) 
    { 
     cout << names[i] << "\n"; 
     for (i = 0; i < NUM_COL_SIZE; i++) 
     { 
      for (int j = 0; j < NUM_ROW_SIZE; j++) 
      { 
      cout << scores[i][j] << "\n"; 
      } 
     } 
    } 
} 
inFile.close(); 

я изолирован из десятки [R] [с] = atoi (mystring.c_str()); и программа работает, хотя и дает значения для мусора. Вот что выход:

The names are: 
Linus too good 
0 
2.96439e-323 
6.63467e-315 
6.95306e-310 
6.94939e-310 
1.4822e-323 
2.52023e-320 
6.94939e-310 
6.94939e-310 
6.95306e-310 
6.91692e-323 
7.6287e+228 
6.59695e-310 
6.94939e-310 
6.95306e-310 
6.95306e-310 
7.41098e-323 
3.44197e+175 
1.69599e+161 
5.83684e-310 
6.95306e-310 
6.94939e-310 
0 
6.94939e-310 
0 
0 
0 
0 
1.02437e-316 
4.04739e-320 

Спасибо заранее за любую помощь по этому вопросу.

+1

Вы указали 'двойные баллы [NUM_ROW_SIZE] [NUM_COL_SIZE];' с 'NUM_ROW_SIZE = 3'. Однако ваш цикл 'for (int r = 0; r <10; r ++)' подходит к 'r = 10' и вы получаете доступ к' score [r] [c] '. Плохо. Правильный диапазон 'r' составляет от 0 до 2. – lurker

+0

Просто FYI, как ошибка сегации, так и количество мусора фактически указывают на ту же проблему. Это оба возможных результата «неопределенного поведения». См. Также: [Окончательный список общих причин сбоев сегментации] (http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – CodeMouse92

+0

ty для справки. – mrbw

ответ

0

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

Одна ошибка находится в вложенных циклах, где вы пытаетесь распечатать результаты, и вы использовали i дважды во внешней и внутренней петлях. (Я не думаю, что необходим внутренний контур for (i = 0; i < NUM_COL_SIZE; i++).)

Другая ошибка, когда вы объявляете 2D-массив scores. Попробуйте double scores[10][3];

Я пробовал свой код с этими двумя исправлениями, и это сработало.

Добро пожаловать на C++ и удачную отладку!

+0

Это исправлено. = D Большое спасибо. – mrbw

0

Вы объявили массив с max rows = 3 и columns = 10, но вы обращаетесь в обратном порядке. Так Поменяйте

scores[r][c] = atoi(mystring.c_str());

с

scores[c][r] = atoi(mystring.c_str());

Смежные вопросы