std::string Доступ к элементу массива

Несмотря на то, что это программа Project Euler, следующий код на самом деле не имеет к ней большого отношения. Я хочу добавить 50 100-значных чисел, и я назначаю каждую цифру каждого числа элементу в массиве addends[100][50]. Затем я складывал каждую цифру/место по отдельности и переносил дополнительные цифры. Числа считываются из текстового файла с именем Input.txt, и он просто содержит все числа. http://projecteuler.net/problem=13

У меня возникли проблемы с назначением символов элементам массива строк (string numbers[100][50]) из входного потока файла (<fstream>). Более подробно проблема описана в комментариях:

«[для 1-го цикла] Этот цикл присваивает номер каждой строке в массиве строк. Даже если второе число (50) ничего не делает (кажется, что оно переопределяется std::string; см. объявление переменной), он должен быть там, чтобы цикл работал. Та же «логика» для цикла; «j» ничего не делает, но должен быть там, чтобы цикл работал?»

А также (для 2-го цикла) «Этот цикл заполняет массив «addends [100] [50]» из соответствующего элемента массива строк. Если я попытаюсь вызвать «char_to_int ()» с массивом «числа [i] [j]», компилятор жалуется, что входные данные имеют неправильный тип данных. Добавление переменной «k» заставляет цикл работать для одного запуска, но в конечном итоге происходит сбой во втором цикле (с использованием «numbers[i][j ][k]"). Итак, я попробовал "char_to_int((numbers[i][j]).c_str())", но компилятор жалуется, что "const char *" несовместим с "char". Добавление указателя разрешает проблема ("char_to_int( *( (numbers[i][j]).c_str() ) )")), но позже программа все равно вылетает." Я вынул некоторый код, который не имеет значения, чтобы сделать его более читаемым.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int char_to_int(char chInput);

int main()
{

    int placeholder;    //so console doesn't close immediately upon finish
    int sum[102] = {0}; // 100+2, 100 places + 2 places from carrying over
    int addends[100][50] = {0};
    string numbers[100][50];
    ifstream input("Input.txt");

    /* This loop assigns a number to every string in the string array. Even
     * though the second number (50) doesn't do anything (it seems to be
     * overridden by std::string; see variable declaration), it needs to be
     * there for the loop to work. Same "logic" for the loop; "j" doesn't do
     * anything but needs to be there??? Confused :-\
     */
    for (int i = 0; i < 100; i++)
        for (int j = 0; j < 1; j++)
            getline(input, numbers[i][j]);

    /* This loop fills in the "addends[100][50]" array from the corresponding
     * string array element. If I try to call "char_to_int()" with the array
     * "numbers[i][j]", the compliler complains that the input isn't of the
     * right data type. Adding a variable "k" makes the loop work for one run,
     * but eventually crashes on the second loop (using "numbers[i][j][k]").
     * So I tried "char_to_int((numbers[i][j]).c_str())", but the compiler
     * complains that "const char *" is incompatible with "char". Adding a
     * pointer resolves the issue ("char_to_int( *( (numbers[i][j]).c_str() ) )"),
     * but the program still crashes on the second loop through.
     */
    for (int i = 0; i < 100; i++)
        for (int j = 0; j < 50; j++)
            for (int k = 0; k < 1; k++) //used when the variable "k" was being used
                addends[i][j] = char_to_int( (numbers[i][j]).c_str() );

    return 0;
}

Код не закончен; Я решил не продолжать, так как мне (очевидно) нужно сначала исправить это.


person Ernest3.14    schedule 04.04.2012    source источник
comment
Есть ли причина не использовать С++ STL, такие как вектор, карта и т. Д., Вместо массива (и обращаться к ним позже с помощью итераторов)?   -  person enthusiasticgeek    schedule 03.12.2013


Ответы (1)


Он компилируется и работает нормально с

string numbers[100];

for (int i = 0; i < 100; i++)
        getline(input, numbers[i]);

for (int i = 0; i < 100; i++)
    for (int j = 0; j < 50; j++)
            addends[i][j] = char_to_int( (numbers[i][j]));

после удаления включения stdafx.h и определения char_to_int.

std::string содержит сам массив символов, поэтому вам нужен только одномерный массив std::string. Затем вы можете получить доступ к символам строки с помощью [] индексации,

numbers[i][j]

получает j-й символ (вернее, байт) i-й строки в массиве numbers.

person Daniel Fischer    schedule 04.04.2012
comment
Спасибо! Это работает. Однако, когда я пытаюсь просмотреть строки, отличные от первой в массиве, мое окно просмотра не показывает их. Я использую Visual Studio Express 2010. - person Ernest3.14; 05.04.2012
comment
Странно. Я могу cout << numbers[i] << endl; без проблем (но тогда я использую gcc на linux). Как вы пытаетесь отобразить строки? - person Daniel Fischer; 05.04.2012
comment
В режиме отладки Visual Studio сообщает мне (через окно просмотра), что numbers[0] — это 3, numbers[1] — это 7 и так далее. - person Ernest3.14; 05.04.2012
comment
Хм, каждый numbers[i] должен состоять из 50 цифр, так как это результат getline(). Что это показывает, если вы cout << numbers[i] << endl; на пару i? - person Daniel Fischer; 05.04.2012