在内存和比较中表示C字符串

时间:2013-05-31 10:42:06

标签: c string comparison null-terminated

我有这样的代码:

char str1[100] = "Hel0lo";
char *p;
for (p = str1; *p != 0; p++) {
    cout << *p << endl; 
    /* skip along till the end */ 
}

并且有些部分对我来说并不清楚。 我知道内存中以空字符结尾的字符串是字节,所有位都等于0(ASCII)。这就是为什么当*p != 0我们决定找到字符串的结尾时。如果我想搜索到零字符,我应该与48进行比较,根据内存中的ASCII,DEC表示为0。

但为什么在访问内存时我们使用HEX个数字并进行比较,我们使用DEC个数字?

是否可以将"\0"作为字符串的结尾进行比较?像这样(不工作):

for (p = str1; *p != "\0"; p++) {

据我所知,"\48"等于0

2 个答案:

答案 0 :(得分:2)

你的循环包括退出测试

*p != "\0"

这会获取char p的值,将其提升为int,然后将其与字符串文字"\0"的地址进行比较。我认为你的意思是与nul字符'\0'进行比较而不是

*p != '\0'

关于与十六进制,十进制或八进制值的比较 - 没有设置规则,您可以互换使用它们,但应该尝试使用似乎使您的代码最容易阅读的任何内容。人们经常使用十六进制和按位操作或处理二进制数据。但请注意,'0'48x30'\060'相同,但与'\0'不同。

答案 1 :(得分:2)

是的,您可以比较字符串的结尾,如:

for (p = str1; *p != '\0'; p++) {
        // your code 
}

\0 char的ASCII值为0(零)

你可以做到

for (p = str1; *p ; p++) {
        // your code 
}

正如@Whozraig也评论过,因为*p\0而ASCII值是0是假的