每次循环时输出一个少一个字符的char数组

时间:2017-09-13 15:29:47

标签: c++ arrays

我是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'; 有人可以解释一下这部分是什么意思吗?

最后还有另一种解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:1)

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

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

strlen计算第一个 null终止符(\0)之前的字符数,因此您的初始长度为11.每次运行while循环时,您都行进null回到一个角色:

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-string)。

答案 1 :(得分:0)

strlen获取字符串的长度。

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

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

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

所以基本上你经历了你的字符串并使它在每次

之前以一个字符为空终止

答案 2 :(得分:0)

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

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

试图避免在循环中对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贡献而更新了第二个解决方案)