我可以用c ++做一个多维char数组吗?

时间:2009-10-05 16:27:35

标签: c++ c character-arrays

首先,这是一个“功课”问题,因此矢量库和字符串库是不受限制的。我正试图了解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 个答案:

答案 0 :(得分:4)

如果输入的字符串长度不是50个字符(cart_length),则名称中少于50个字符有效。你的第二个循环应该有一个if(cart_of_names[0][x]==0) break;

答案 1 :(得分: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;
}

答案 2 :(得分:2)

查看STLSoft的fixed_array_2d(它是higher order siblings)。在Matthew Wilson的Imperfect C++中,详细讨论了如何实现它们以实现最佳性能。

答案 3 :(得分:0)

如果你不能使用std :: string,至少要查看C中的strncpy()等函数来复制你的名字。此外,您忘记了c样式的字符串是空终止的。

答案 4 :(得分:0)

如果使用strcpy()而不是         cart_of_names [0] [i] = name [i];

它可能会更好,但我只是看着所有代码而感到畏缩。

答案 5 :(得分:0)

除非你被禁止使用STL(这只是意思),否则只需使用std::list<std::string>。 www.cplusplus.com提供了这些课程的详细说明和示例。

否则,你会遇到一个char数组数组:在这种情况下,要为很多缓冲区溢出错误做好准备。在上面的网站上查看char []管理功能(strncpy()等),它们会让您的生活更轻松(但不是很多)。

答案 6 :(得分:0)

在C中,我发现概念化你要做的事情的最好方法是使用char *数组。同样的效果,但如果你开始使用它,我相信你可能会发现它在大脑中更容易。

答案 7 :(得分:0)

它看起来非常接近我。 C中的字符串以空值终止,这意味着字符串的结尾由空字符表示。从某种意义上说,C中的字符串实际上只是一个字节数组。

当你这样做时:

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

如果我输入字符串“Book”,在内存中它看起来像是:

|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知道字符串的结束位置,因为终止空字符。

答案 8 :(得分: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;
}