2009-10-05 2 views
1

Во-первых, это вопрос «домашней работы», поэтому векторные библиотеки и библиотеки строк находятся вне пределов. Я пытаюсь перейти к основам C++.Могу ли я сделать многомерный массив символов в C++?

Мое намерение с помощью этого кода состоит в создании и использовании массива строковых массивов. Список слов другими словами.

Когда я запускаю этот код, я получаю кучу бессмыслицы.

Если есть лучший способ составить список слов в C++, я хотел бы услышать об этом.

const int cart_length = 50; 
const int word_length = 50; 

int main() 
{ 

char cart_of_names[cart_length][word_length]; 
float cart_of_costs[cart_length]; 

char name[word_length]; 
cout << "enter the name of the first item: "; 
cin >> name; 
for(int i=0; i<word_length; i++) 
{ 
    cart_of_names[0][i] = name[i]; 
} 
cout << endl; 
cout << "that is: "; 
for(int x=0; x<word_length; x++) 
{ 

     cout << cart_of_names[0][x]; 
} 
cout << endl; 

return 0; 
} 
+0

что вы подразумеваете под нонсенсом? – Bob

+1

Возможно, потому что массив c-строк cart_of_names не имеет нулевого конца? – Calyth

+2

@tim, его [n] [m] порядок верен. Calyth ближе к замечанию о завершении. Имя и cart_of_names должны быть завершены в ноль, но он не проверяет нулевое завершение, когда он записывает строку по-символу. – Adisak

ответ

2

Я не совсем понимаю, что вы ищете. Следующий код поможет вам прочитать и распечатать список из 50 слов. Надеюсь, это поможет вам.

const int cart_length = 50; 
const int word_length = 50; 

int main() 
{ 

    char cart_of_names[cart_length][word_length]; 
    float cart_of_costs[cart_length]; 

    for(int i=0; i<cart_length; i++) 
    { 
     cout << "enter the name of the " << i + 1 << "th item: "; 

     cin >> cart_of_names[i]; 
    } 

    cout << "that is: "; 

    for(int x=0; x < cart_length; x++) 
    {  
     cout << cart_of_names[x] << endl; 
    } 

    return 0; 
} 
+0

Это было намного проще, чем я это делал. Благодарю. – peter

0

Если вы не можете использовать зЬй :: строку, по крайней мере, рассмотрим функции, как strncpy() из C для вашего имени копирования. Кроме того, вы забываете, что строки c-стиля имеют нулевое завершение.

0

Если вы используете strcpy() вместо cart_of_names [0] [i] = name [i];

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

+0

«Во-первых, это вопрос« домашних заданий », поэтому векторные библиотеки и библиотеки строк не работают». – Jodi

+0

@ Джоди - как-то я пропустил это. Не беспокойся в таком случае. Это не C++, то есть прямо C. – Tim

4

Если введенная строка не длинна 50 символов (cart_length), то в имени будет указано менее 50 символов. У вас должен быть if(cart_of_names[0][x]==0) break; во втором цикле.

+1

О, и, как и другие плакаты, упоминайте, если вы можете использовать функции clib strXXX(), вы должны их использовать. Если ваша домашняя работа заключается в том, чтобы непосредственно манипулировать символами как часть строки, тогда вам нужно иметь нулевую проверку, которую я упоминаю, чтобы определить, когда строка завершается. – Adisak

+0

Не имеет значения, действительны ли менее 50 символов. Он назначил имя 50 персонажам, чтобы он мог копировать «имя \ 0garbageupto50chars» вокруг всего, что ему нравится. Имя cin >>; и cout << cart_of_names [x]; будет обрабатывать нулевой байт для него (если имя короче 50 символов, конечно). IOW, он использует memcpy вместо strncpy. Ничего страшного. – jmucchiello

+0

@jmucchiello - Извините, но вы ошибаетесь ... он не выводит cout << cart_of_names [x]; (целая строка @ смещение X), а скорее cout << cart_of_names [0] [x]; (каждый символ X строки @ offset 0). В этом случае ему нужно беспокоиться о недопустимых символах и проверять завершение NULL в cart_of_names [0] при выводе символов этой строки. – Adisak

0

Если вам запрещено использовать STL (что было бы просто означать), просто используйте std::list<std::string>. www.cplusplus.com содержит подробные описания и примеры для этих классов.

В противном случае вы застряли с массивом массивов символов: в этом случае будьте готовы к большому количеству ошибок переполнения буфера. Оглянитесь на вышеуказанный сайт для функций управления char [] (strncpy() и т. П.), Они сделают вашу жизнь немного легче (но не много).

0

В C наилучшим образом я нашел концептуализацию того, что вы пытаетесь сделать, это использовать массив char *. Тот же эффект, но если вы начнете работать с ним, я считаю, что вы можете обнаружить, что его легче в мозгу.

0

Он выглядит довольно близко ко мне. Строки в C заканчиваются на нуль, что означает, что конец строки обозначается нулевым символом. В некотором смысле, строка в C действительно представляет собой массив байтов.

Когда вы делаете:

cout << "enter the name of the first item: "; 
cin >> name; 

Если я ввожу строку «Книга», в памяти он будет выглядеть примерно так:

|0|1|2|3|4|5..49| 
|B|o|o|k|0|*HERE BE DRAGONS* 

Ну, на самом деле она будет содержать ASCII values соответствующие на эти письма, но для наших целей он содержит эти письма. Там here be dragons - это память, которую вы не инициализировали, поэтому в ней содержится всякий мусор, на который устанавливается ваша платформа.

Итак, когда вы копируете свою строку, вам нужно вместо этого найти этот байт 0 в конце строки.

for(int i=0; name[i]!=0; i++) 
{ 
    cart_of_names[0][i] = name[i]; 
} 

Затем, когда вы выводите его, вам фактически не нужно делать это персонажем за раз. Вы можете просто сделать cout<<cart_of_names[0]. cout знает, где заканчивается строка из-за этого завершающего нулевого символа.

+0

Для справки 0 == NULL прямо сейчас, поэтому он проверяет 'name [i]! = 0'; 'name [i]' возвращает ссылку (фактический символ). – jkeys

+0

Это будет работать только в том случае, если cart_of_names [0] [*] - массив нулей. –

+0

@sharth: Я не понимаю, почему? – notJim

0

«Если есть лучший способ составить список слов в C++, я хотел бы услышать об этом».

Включите #include <string> и используйте std::string. Я думаю, что тип std::string является частью спецификации C++.

#include <iostream> 
#include <string> 

int main(void) { 
    std::string list[7]; 

    list[0] = "In C++"; 
    list[1] = "you can use"; 
    list[2] = "the `std::string` type."; 
    list[3] = "It removes"; 
    list[4] = "many of the problems"; 
    list[5] = "introduced by"; 
    list[6] = "C-style strings."; 

    for (int k=0; k<7; k++) std::cout << list[k] << ' '; 
    std::cout << '\n'; 
    return 0; 
} 
Смежные вопросы