2010-03-02 4 views
0

То, что я пытаюсь сделать, это создать класс массива шаблонов, который будет хранить значения типа данных в массиве. У меня он отлично работает со значениями int, однако работа со строковыми объектами начинает разрушаться.добавление строковых объектов в массив через цикл

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

Моя лучшая догадка прямо сейчас заключается в том, что мне нужно будет токенизировать строку и искать пробелы. Я склоняюсь к тому, чтобы думать о вещах, которые приводят к большей путанице, поэтому я ищу ответ здесь!

Код:

// Test String: Hello World this is a String Object 
int stringSize = 7; 
int count = 0; 

string s[stringSize]; 

cout << "\nEnter " << stringSize << " one-word string values:\n"; 

while (count < stringSize) { 

    string tmpVal; 

    cin >> tmpVal; 
    s[count] = tmpVal; 

    count ++; 
} 
+1

Какая ошибка? –

+1

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

+0

У меня нет ошибок с кодом выше. Это помогло бы, если бы вы указали * ошибку, которую вы получаете ... – DevSolar

ответ

1

string s[stringSize]; является незаконным, потому что stringSize не является константой. Вы должны либо использовать динамическую память (то есть string* s = new string [stringSize];), включите stringsize в качестве аргумента шаблона (не делайте этого, он фактически не решает проблему), используйте фиксированное значение размера или используйте существующую структуру (я бы предложил vector, как в ответе Билла). Приведенный ниже код работает отлично на мой компилятор:

int main(int argc, char *argv[]) { 
int stringSize = 7; 
int count = 0; 
string* s = new string [stringSize]; 
cout << "\nEnter " << stringSize << " one-word string values:\n"; 
while (count < stringSize) { 
    string tmpVal; 
    cin >> tmpVal; 
    s[count] = tmpVal; 
    count ++; 
    } 
    delete[] s; 
} 
+0

string s [7] отлично. он объявляет массив из 7 строк строка s [val] действительна для gcc, которая позволяет массивы стека динамически размер; его проблема в том, что он сделал фиксированный размер массива, он должен быть вектором – pm100

+0

@ pm100: 'string s [size];' действует только на gcc из-за расширения компилятора. Это не переносимый код, как выяснил ОП. 'const int size = 7; string s [size]; 'is valid C++, предполагая, что вектор не является правильным решением. – Bill

+0

тот что я сказал. Брайан сказал, что строка s [stringSize] является недопустимой, потому что она является динамической строкой, а не ее, ее массив строк на некоторых платформах и не компилируется на других платформах. Может быть, он имел в виду «динамический массив строк» ​​ – pm100

1

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

Может быть что-то вроде:

list<string> s; 

, а затем, в использовании петли push_back.

0

Почему бы не прочитать во всей строке, а затем найти все пробелы и использовать метод substr, разделите строку?

Вам понадобятся следующие методы: getline() find_first_of() substr()

Кроме того, поиск вокруг этого сайта для разделения строк в C++ даст вам много советов.

+0

Im, используя класс шаблона, поэтому я хотел избежать разделения строк – cdnicoll

0

Прежде всего, размер вашего массива должен быть постоянным:

const int stringSize = 7; 

Во-вторых, как сказал dbrien, вы должны использовать зЬй :: вектор, если вы делаете это для опыта обучения:

std::string tmpVal; 
std::vector<std::string> s; 
cout << "\nEnter " << stringSize << " one-word string values:\n"; 

while (cin >> tmpVal) 
{ 
    s.push_back(tmpVal); 
} 
0

Во-первых, размер массива должен быть постоянным, поэтому она должна быть константной ИНТ stringsize = 7; Кроме того, я бы предложил использовать std :: vector, а не std :: list, дополнительно. Какова была ошибка?

0

Не уверен, что ошибка, вы получаете, но это неправильно, потому что вы должны использовать постоянное интегральное значение для распределения массивов в стеке .. Изменение:

int stringSize = 7; 
int count = 0; 

string s[stringSize]; 

...чтобы:

const int stringSize = 7; 
int count = 0; 

string s[stringSize]; 

Вы можете и, вероятно, следует также использовать вектор вместо использования массивов C-стиля, или пытается передать свернуть свой собственный шаблонного класс массива:

vector<string> s; 
const int stringSize = 7; 

cout << "\nEnter " << stringSize << " one-word string values:\n"; 

while (s.size() < stringSize) { 

    string tmpVal; 

    cin >> tmpVal; 
    s.push_back(tmpVal); 
} 
-2

Так что получается, что это было компилятор. Я использую Xcode и получить:

cin_cout(7307) malloc: *** error for object 0x1000072c0: pointer being freed was not allocated 

*** установить контрольную точку в malloc_error_break для отладки

Запуск и тот же блок в Visual C++, казалось, хорошо ... Извините за моей глупости и благодаря любезно для вся быстрая обратная связь!

+4

Пожалуйста, отредактируйте свой собственный пост, а не ответьте на него. –

0

Я также смущен, каков ваш реальный вопрос, потому что ваш код работает. Однако, FWIW, я бы предложил следующее. Изменения следующие: (1) использование const (уже предложенное другими), (2) использование size_t, (3) изменение имени переменной stringSize в numStrings (из-за этого я был сбит с первого взгляда) и (4) избегая строковой копии.

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    const size_t numStrings = 7; 
    size_t count = 0; 

    string s[ numStrings ]; 

    cout << "\nEnter " << numStrings << " one-word string values:\n"; 

    while (count < numStrings) { 
     cin >> s[ count ]; 
     count++; 
    } 

    return 0; 
} 
Смежные вопросы