2017-09-13 211 views
1

我是C++新手。尝试一个简单的问题:每次循环输出一个字符数组少一个字符

创建一个while循环,其输出与每次循环,直到它仅保持在其内“\ 0”值时间少一个字符 字符数组。

答案是:

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

但是我使用的strlen下没有。 特别是这个零件:s[strlen(s) - 1] = '\0'; 有人可以解释这部分是什么意思?

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

+0

's [strlen(s) - 1] ='\ 0';'将终止的c-string字符设置为之前的一个较小的位置。 – user0042

+2

[你知道strlen是做什么的吗?](http://en.cppreference.com/w/cpp/string/byte/strlen) – Simple

+0

他你查了什么'strlen'呢? – Carcigenicate

回答

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; 
} 

(第2解决方案更新感谢@simple贡献)

+0

非常感谢! 关于第一个解决方案的一些问题: 我不明白'while(p!= pEnd)',它表示p不等于'pEnd',但是这将是错误的,那么循环将不会执行。纠正我,如果我错了。 和第二种解决方案: 通过使用字符串,它不会包含'\ 0'? – engkhsky

+0

'str.resize(str.length() - 1);'''str.pop_back();' – Simple

+0

@Simple,谢谢我学到了另一种解决它的新方法。 – engkhsky

0

strlen获取字符串的长度。

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

“\ 0”是一个空终止符

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

所以基本上你要通过你的字符串,使之,使之与空一个字符前面每次终止

+0

有几个代码来显示字符串或字符的长度是否正确? 如'str.size'和'str.length' ,我看到'size_t',我不明白它是如何工作的。 – engkhsky

+0

所以str.length()适用于strings.http://www.cplusplus.com/reference/string/string/length/。和str.size()适用于数组http://www.cplusplus.com/reference/array/array/size/ – Legman

+0

,这里是size_t的参考。我不使用那么多http://en.cppreference.com/w/cpp/types/size_t – Legman

1

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

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

strlen数字符规格妥当第一空终结(\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-string是基于0这就是为什么-1s[strlen(s) - 1] = '\0';(以点到C-string中的最后一个字符)。

+0

谢谢你解释! for's [strlen(s) - 1] ='\ 0';''[]'中的内容是数组右边的索引? – engkhsky

相关问题