Могу ли я сделать многомерный массив символов в C ++? - PullRequest
1 голос
/ 05 октября 2009

Во-первых, это вопрос «домашней работы», поэтому библиотеки векторов и строковые библиотеки запрещены. Я пытаюсь понять основы 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;
}

Ответы [ 9 ]

4 голосов
/ 05 октября 2009

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

2 голосов
/ 06 октября 2009

Проверьте STLSoft fixed_array_2d (и это старшие братья и сестры ). Подробное обсуждение того, как они реализованы для максимальной производительности, в Imperfect C ++ .

Мэтью Уилсона.
2 голосов
/ 05 октября 2009

Я не совсем понимаю, что вы ищете. Следующий код поможет вам прочитать и распечатать список из 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 голосов
/ 06 октября 2009

«Если есть лучший способ составить список слов в 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;
}
0 голосов
/ 05 октября 2009

Это выглядит довольно близко ко мне. Строки в 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-значения , соответствующие этим буквам, но для наших целей он содержит эти буквы. 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 голосов
/ 05 октября 2009

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

0 голосов
/ 05 октября 2009

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

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

0 голосов
/ 05 октября 2009

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

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

0 голосов
/ 05 октября 2009

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

...