簡體   English   中英

如何在循環中使用多維char或字符串數​​組

[英]How to use multidimensional char or string arrays in a loop

我對C ++很陌生,只是無法弄清楚如何使用任何多維數組。 我想做這樣的事情:

input number of product: number; //the products' name can be 7 with NULL char. (max 6)
char arr[number][7];

這樣可行。 但是,當我想在for循環中執行此操作時:

cin>>arr[i][7];

而且我不知道編譯器在做什么?

我只想要:

arr[0][7]=apple;
arr[1][7]=orange;

所以,我該怎么做?

#include <string>
#include <vector>

既然每個人都在推薦它,我想我應該為您列出一些選擇。

請注意, 如果您提供了一個簡短且有效的示例代碼段, 那么您將在10毫秒內得到3個人的這種回答(翻譯代碼1:1比您可能會想到的“思考”示例更有效) )

干得好:

std::vector<std::string> strings

strings.push_back("apple");    
strings.push_back("banana");

// or
std::string s;

std::cin >> s; // a word
strings.push_back(s);

// or
std::getline(std::cin, s); // a whole line
strings.push_back(s);

// or:
// add #include <iterator>
// add #include <algorithm>

std::copy(std::istream_iterator<std::string>(std::cin),
     std::istream_iterator<std::string>(),
     std::back_inserter(strings));

也可以直接尋址:

std::vector<std::string> strings(10); // 10 empty strings

strings[7] = "seventh";

編輯以回應評論:

const char* eighth = "eighth";

if (strings[7] != eighth)
{  
      // not equal
}

// If you really **must** (read, no you don't) you can get a const char* for the string:

const char* sz = strings[7].c_str(); // warning: 
         // invalidated when `strings[7]` is modified/destructed

因為arr[i][7]是一個char ,實際上是最后一個元素之后的一個,這意味着您可能會遇到內存訪問錯誤。

您想做什么也許cin>>arr[i];

但是,這不是一個好主意,因為您無法控制從輸入讀取多少個字符,這很容易導致內存溢出。

如其他人所建議的那樣,簡單的方法是使用std::vector<std::string>

除非您有真正的理由(一定不能對我們隱瞞),否則請按比約恩所說的那樣使用字符串向量。 您甚至可以取消對總大小的初始請求:

#include <string>
#include <vector>
#include <iostream>

std::vector<std::string> fruits;
std::string line;

while (std::getline(std::cin, line))
{
  fruits.push_back(line);
}

讓我們測試一下:

std::cout << "You entered the following items:\n";
for (auto const & f : fruits) std::cout << "* " << f << "\n";

您有一個二維char數組

char arr[number][7];

然后嘗試為它們分配一個字符串(char *或const char *),該字符串將不起作用。 您在這里可以做的就是分配一個字符,例如:

arr[0][1] = 'a';

如果可以的話,我建議您使用std::vectorstd::string來使事情變得更加清晰。 在你的情況下你可以做

cin>>arr[i];

但我不建議您這樣做,因為您最多只能存儲6個字符的char *字符串(加上空終止符)。 您也可以擁有一個char *數組

char* arr[number];

然后動態分配內存以存儲字符串。

strcpy(&arr[0], "apple");
strcpy(&arr[1], "orange");

但是對於C ++來說,最好將std::vector<std::string>用於字符串數組

一旦理解了std :: vector和std :: string,它們通常會為您省去頭痛。 由於您是C ++的新手,因此無論如何了解二維數組的內容可能會很有用。

當你說

char array[N][M];

由於N和M是常量,而不是變量,所以您要告訴編譯器分配char類型的N * M個項目。 將有一塊專用於大小為N * M * sizeof(char)的數組的內存。 (您可以聲明任何數組,而不僅僅是char。由於sizeof(char)為1,因此內存將為N * M字節長。)如果查看原始內存,則內存中的第一個字節將位於array [ 0] [0]是。 第二個字節將是array [0] [1]所在的位置,依此類推,對於M個字節。 然后,您將看到array [1] [0]。 這稱為行優先順序。

正如@ jbat100所提到的,當您說array [i] [j]時,是指一個字符。 當您說array [i]時,是指數組中第i行的地址。 內存中實際上沒有存儲任何指針,但是當您說array [i]時,編譯器知道您的意思是您想要數組中第i行的地址:

char* row_i = array[i];

現在,如果i> 0,則row_i指向該數組專用內存塊中間的某個位置。 這會做同樣的事情:

char* row_i = &array[i][0];

如果您有一個字符串“ orange”,並且知道它的長度小於M,則可以將其存儲在數組的給定行中,如下所示:

strcpy(array[i], "orange"); // or
array[i][0] = 'o'; array[i][1] = 'a'; ... array[i][6] = 0;

或者,您可以說row_i而不是array [i]。 這會將7個字節復制到row_i位置的數組中。 strcpy()還復制一個額外的字節,該字節為0,這是在C和C ++中終止字符串的約定。 因此,這7個字節是六個字節,即“ o”,“ r”,“ a”,“ n”,“ g”和“ e”,再加上一個0字節。 現在strcmp(row_i,“ orange”)== 0。

請注意,如果您的字符串長於M,則strcpy和簡單的char賦值不會(可能)產生編譯錯誤,但最終會將部分字符串復制到下一行。

在一本不錯的C / C ++書中閱讀有關指針和數組的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM