当数组(句子)只有 30 个空间时,为啥要打印 38 个元素?

Posted

技术标签:

【中文标题】当数组(句子)只有 30 个空间时,为啥要打印 38 个元素?【英文标题】:Why is the array (sentence) printing 38 elements when it only have space for 30?当数组(句子)只有 30 个空间时,为什么要打印 38 个元素? 【发布时间】:2021-09-18 22:29:42 【问题描述】:
#include <iostream>
#include <vector>
#include <string>
#include <cstring>

using namespace std;

int main() 
  //initialising the char array and vector
  char sentence[30] = ;
  vector<string> words"The", "only", "thing", "to", "fear", "is", "fear", "itself";

//For loop iterates through the vector and adds the converted strings to the char array
  for(int i = 0; i < words.size(); i++)
//if statements check if there is overflow and breaks the loop if there is
    /*if(strlen(sentence) >= 30)
      cout << "stop" << endl;//comment out later
      break;
    */
//strcat method adds the strings from words to sentence one at a time
    strcat(sentence, words[i].c_str());
    /*if(strlen(sentence) >= 30)
      cout << "stop" << endl;//comment out later
      break;
    */
//strcat method adds a space in between each word in the cstring
    strcat(sentence, " ");
  
//couts the full sentence and the length of sentence
  cout << sentence << " " << strlen(sentence) << endl;
  cout << sentence[29] << endl;

  return 0;

我注释掉了如果数组超过 30 个元素时中断的 if 语句,但现在它返回 38。当我尝试访问数组可以容纳的元素之上的元素时,它仍然给我一个错误。一旦数组goa中的元素数量超过30,编译器不应该抛出错误吗?我对 C++ 很陌生,所以我不确定这是语言本身的问题还是我自己的问题。任何帮助表示赞赏。

【问题讨论】:

您有责任(在代码中)不要写超出数组的末尾。 C++ 不会监控这一点,因为这种开销会使好的代码运行得更慢。 C++ 没有任何边界检查。越界会导致未定义的行为 有关未定义行为的更多信息,请参阅:***.com/a/4105123/131930 除此之外,除非这是学校(或类似的)作业或练习,否则您应该始终使用std::string 处理各种字符串。哪种类型的问题没有实际意义,因为它是动态的并且会根据需要扩展。 一切都使用std::string。您可以使用加法运算符连接两个字符串,例如std::string str = s1 + s2; 其中 s1 和 s2 是字符串有效。只需阅读有关字符串类的文档即可。 【参考方案1】:

索引大于数组大小的数组是未定义的操作。你永远不会知道输出会是什么。 例如,在您的情况下,如果您尝试访问 char c = sentence[37],这是未定义的操作。意味着 char c 可以是从句子的内存位置读取的任何内容 + 37 * sizeof(char) (第 37 个元素的地址)。 我的建议是使用向量,并在索引时使用 at() 方法。如果您尝试访问为该向量保留的空间之外的元素,方法 at() 将抛出 out_of_range 异常。

【讨论】:

以上是关于当数组(句子)只有 30 个空间时,为啥要打印 38 个元素?的主要内容,如果未能解决你的问题,请参考以下文章

所以我做了一个线性搜索代码,但是当我在数组中输入一个数字时,它仍然会打印(数字没有)为啥会这样?

稀疏数组

我这个SQL语句进行多表联查时为啥关联字段查不出来?

当指针指向数组时,为啥 operator(*) 的值不起作用?

我的字符串数组一次打印出前两个字符串

数据结构01-稀疏数组