【问题标题】:Outputs a char array with one less character everytime it loops每次循环时输出一个少一个字符的 char 数组
【发布时间】:2017-09-13 15:29:47
【问题描述】:

我是 C++ 新手。尝试一个简单的问题:

创建一个 while 循环,输出一个少一个字符的 char 数组 每次循环,直到它只包含 '\0' 值。

答案是:

char s[] = "Hello World";
while (strlen(s))
{
    s[strlen(s) - 1] = '\0';
    cout << s << endl;
}

不过我没有使用strlen。 特别是这部分:s[strlen(s) - 1] = '\0'; 谁能解释一下这部分是什么意思?

最后还有其他方法可以解决这个问题吗?

【问题讨论】:

  • s[strlen(s) - 1] = '\0'; 将终止 c 字符串字符设置为比以前少一个位置。
  • 你查过strlen做了什么?
  • 您的代码不会打印整个字符串。是故意的吗?它是要求的一部分吗?
  • 使用 std::string,而不是 char 数组!

标签: c++ arrays


【解决方案1】:

c 字符串有一个空终止符(即\0),所以在你的情况下,你的字符串实际上是:

H e l l o   W o r l d \0

strlen 计算 first 空终止符 (\0) 之前的字符数,因此您的初始长度为 11。每次运行 while 循环时,都会将空字符向后移动一个,因此:

H e l l o   W o r l \0 \0
H e l l o   W o r \0 \0 \0
H e l l o   W o \0 \0 \0 \0

这实质上减小了strlen的大小。

类似地,cout 打印到第一个空终止符 (\0)。

要注意的另一件事是strlen 返回字符数,但是 c 字符串基于 0,这就是为什么 -1s[strlen(s) - 1] = '\0'; 中(指向 c 字符串中的最后一个字符)。

【讨论】:

  • 感谢您的解释!对于s[strlen(s) - 1] = '\0';[ ] 中的内容是数组的索引对吗?
【解决方案2】:

正如有人已经回答的那样,s[strlen(s) - 1] = '\0'; 这是一种缩短字符串的方法,将字符串末尾的空 ('\0') 字符向后移动。

当您询问做同样事情的另一种方法时,这里有两个例子:

尽量避免在ever循环中重复调用strlen:

   char p[] = "Hello World";
    char* pEnd = &p[strlen(p)];
    while (p!=pEnd)
    {
        *--pEnd = '\0';
        cout << p << endl;
    }

一种更现代的方法来保持您在示例中绘​​制的主线:

std::string str("Hello World");
while(str.length() > 0) {
    str.pop_back();
    cout << str << endl;
}

(感谢@Simple 的贡献更新了第二个解决方案)

【讨论】:

  • 非常感谢!关于第一个解决方案的一些问题:我不明白 while (p!=pEnd),这意味着 p 不等于 pEnd 但那将是错误的,那么循环将不会执行。如果我错了,请纠正我。对于第二个解决方案:通过使用字符串,它不会包含\0 对吗?
  • str.resize(str.length()-1);str.pop_back();
  • @engkhsky,不过这是一个很好的问题(字符串对象中大约是 \0)。我相信为了速度,它可能在,但是,但是..为了访问字符串作为(const)char(或const char *)的标准数组,您需要通过c_str()访问。所以我相信答案是:你不能假设一个字符串的 std:string 中的内部 rappresentation 是一个 char null 终止的数组。由于 std 库总是试图变得非常高效,我相信为了记住它的内部 rappresentation 在末尾包含一个 \0,但不要在编码时假设它。
【解决方案3】:

strlen 获取字符串的长度。

http://www.cplusplus.com/reference/cstring/strlen/

'\0' 是一个空终止字符

https://en.wikipedia.org/wiki/Null-terminated_string

所以基本上你会遍历你的字符串并使其每次都以 null 终止一个字符

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2015-12-07
相关资源
最近更新 更多