我是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';
有人可以解释一下这部分是什么意思吗?
最后还有另一种解决这个问题的方法吗?
答案 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,这就是-1
在s[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贡献而更新了第二个解决方案)