我阵列的长度是多少?

时间:2015-04-24 23:41:13

标签: c++ arrays

大家好,我在使用strlen和数组时遇到问题,它一直说我的字符串长度只有一个?如果有人可以提供帮助,那么我的代码就会很棒:

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

int main()
{
    char word1[20];
    int len = strlen(word1);
    cout << "enter a word!\n";
    cin.get(word1, 20, '\n'); cin.ignore(50,'\n');
    cout << len;
}

4 个答案:

答案 0 :(得分:1)

只需在评论中来回阅读,更新我的答案,尝试更加直观地了解正在发生的事情。

char word1[20];在计算机内存中设置一个最终可由最多20个字符的数据填充的位置。请注意,仅此声明并未明确&#34;清除&#34;对当前存在的任何事物的记忆。正如sfjac所指出的那样,这意味着任何东西都可能存在于那个空间中。这个空间中的任何东西都是一个角色或你的代码可以轻易理解的任何东西,这是不太可能的。

int len = strlen(word1);创建一个整数,并将其设置为等于word1中当前字符数的值。请注意,因为我们没有为word1指定任何内容,所以您已经考虑了该内存空间中发生的任何内容的长度。您已将最大值限制为20,但在这种情况下,无论数据垃圾是什么,都会给您一个长度为1。

cout << "enter a word!\n";提示用户输入单词

cin.get(word1, 20, '\n'); cin.ignore(50,'\n');获取消息,将其存储在word1中。此时,word1现在已定义为实际内容。但是 - 您已经定义了变量len。计算机不知道为您自动重新定义此项。它按顺序遵循您提供的步骤。

cout << len;打印len中存储的值。由于len是在用户输入数据之前创建的,因此len与用户输入的内容完全无关。

希望这有助于你提供一些超越这一问题的直觉!

答案 1 :(得分:1)

@Chris是正确的,但也许是一个小解释。在堆栈上声明像char word1[20]这样的字符数组时,不会初始化该数组。 strlen函数通过计算从word1的地址到内存中第一个空字节的字符数来计算数组的长度,这几乎可以是任何东西。

答案 2 :(得分:0)

我强烈建议您使用std::string作为文字。

如果必须使用字符数组:

  • 定义容量的命名标识符。
  • 使用命名标识符定义数组。
  • 容量应考虑终止nul,'\ 0',字符为 标记最大文本长度的结尾。

使用上述指南,您可以使用简单的程序:

int main(void)
{
  std::string a_word_string;
  std::string line_of_text_string;
  const unsigned int c_string_capacity = 32U;
  char c_string[c_string_capacity];

  // The std::string functions
  cout << "Enter some text: ";
  getline(cin, line_of_text_string); // read a line of text
  cout << "\nEnter a sentence: ";
  cin >> a_word_string;
  cin.ignore(10000, '\n'); // Ignore remaining text in the buffer.

  // The C-style string functions
  cout << "Enter more text: ";
  cin.read(c_string, c_string_capacity);
  c_string[c_string_capacity - 1] = '\0'; // Insurance, force end of string character
  cout << "You entered " << (strlen(c_string)) << " characters.\n";
  return EXIT_SUCCESS;
}

std::string类效率更高,可以动态处理大小更改。

数组的长度是定义数组时使用的c_string_capacity的值。

数组中文本的长度定义为strlen(c_string),这是找到终止nul之前的字符数。

答案 3 :(得分:0)

您必须在阅读len后计算word1,否则您将面临未定义的行为。

char word1[20];
cout << "enter a word!\n";
cin.get(word1, 20, '\n'); cin.ignore(50,'\n');
int len = strlen(word1);
cout << len;

在声明对象时始终初始化对象是个好主意。由于无法保证范围内的对象,因此初始化 例如,在C ++ 11中,您可以这样做:

char arr[10]{};  // this will initialize the objects in the array to default.
char arr[10]{0}; // the same.