【问题标题】:Does null character exist at the end of string vector's elements? [duplicate]字符串向量元素的末尾是否存在空字符? [复制]
【发布时间】:2021-10-29 06:46:08
【问题描述】:

我的问题与 LeetCode 中的 "longest common prefix" 问题有关。(https://leetcode.com/problems/longest-common-prefix/)

这是我的代码:

#include <string>

class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
    int cnt = 0;
    string result = "";
    char ch = ' '; 
    char standard = ' ';
    
    for(int i=0; i<strs.size(); i++){
        if(strs[i].size() == 0) return result;
    }
    
    if(strs.size() == 1){
       return strs[0];
    } 

    while(1){
        standard = strs[0][cnt];
        for(int i=0; i<strs.size(); i++){
            ch = strs[i][cnt];
            if(ch == '\0' || ch != standard) return result; 
          
        } 
        
        result+=ch;
        cnt++; 
    }
}

};

在迭代向量的字符串元素中的每个字符时,我尝试通过使用代码来处理字符串向量中的所有元素完全相等的异常

if(ch == '\0'...)

但是我了解到 C++ 中的字符串类在字符串的末尾不包含空字符,所以我认为这段代码不起作用,因为我编写的代码毫无意义。

但是为什么这段代码可以工作...?

C++ 是否会自动将空字符放入字符串向量的元素中而不放入字符串中?

【问题讨论】:

  • 从 C++11 开始,读取“过去”字符串的最后一个字符会产生空字符。在此之前,行为是未定义的。
  • @molbdnilo 那么你的意思是仅仅访问字符串的最后一个字符会自动在字符串的末尾附加空字符吗?
  • 不,我的意思只是 s[s.size()] 返回(引用)空字符。 (而且,从this 来看,我错了;显然,阅读该角色一直是明确定义的。)

标签: c++ string vector null


【解决方案1】:

是的。 '\0' 字符是空终止字符。这表示字符串的结尾。引擎盖下的字符串是一个字符数组。并且内存必须知道该数组何时结束,因此它会在字符串结束后放置一个 \0 并表示结束。

如果您尝试执行以下操作:

std::str = "Hello"
std::cout << str[str.cout()];

您不会得到输出,但也不会得到垃圾值。终端实际上​​是在打印 '\0' 字符

您也可以使用此程序进行检查:

std::string tmp = "Hello";

if (tmp[tmp.size()] == '\0')
    std::cout << "True\n";

由于是从 0 开始计数,所以字符串中的第 5 个字符实际上是一个空终止值。

长话短说: 每个字符串的末尾都有一个 '\0' ,而在您打印它时没有实际显示它,也没有在您使用 str.size() 获取字符串的大小时显示它;

希望这有帮助!

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多