1
#include<stdio.h>
#include<string.h>

int main()
{
     char *p = "hello world";
     int a = (int)(*(p+strlen(p)+1)); // equal to a=(int)(*p+12)
     printf("%d\n", a);
     return 0;
}

a 不是'\0',为什么?

#include<stdio.h>
#include<string.h>

int main()
{
     char *p = "hello world";
     int a = (int)(*(p+strlen(p)+1)); // equal to a=(int)(*p+12)
     for(int i=0; p[i]!='\0'; i++)
         printf("%c",p[i]);
     return 0;
}

return: hello world 所以,我想知道字符串末尾是否存在 '\0' ?

4

5 回答 5

4
int a = (int)(*(p+strlen(p)+1));  

你又超过了一个..

你需要这样定义

int a = (int)(*(p+strlen(p)));  //now a consists 0 integer value of null

让我们看看这个

char *p ="abc";
p   ==>a 
p+1 ==>b
p+2 ==>c 
p+3 ==>null  

编辑:
C- adds '\0' implicitly当您初始化直接字符串时。
但是,如果您静态初始化,您会发现一些差异。

这两个相等的字符串

 char *p = "helloworld";
 char q[]={'h','e','l','l','o','w','o','r','l','d','\0'};

这些不是

 char *p = "helloworld";
 char q[]={'h','e','l','l','o','w','o','r','l','d'};  

用这个观察结果

if (!strcmp(p,q))
 printf("both are same\n ");
于 2013-09-07T14:44:17.777 回答
2

您以 1 的优势出局,读取 nul 终止符之外 1 个字节的值。尝试

int a = *(p+strlen(p));

反而

于 2013-09-07T14:41:03.210 回答
2

要回答实际问题,是的,C 总是\0在字符串文字中添加终止符。

于 2013-09-07T14:51:58.913 回答
1

是的,如果您使用简单的字符串。比如 char a[6]= {'H','e','l','l','o','\0'}; 您需要在外部编写空指针,但在直接字符串中或使用指针变量编译器会自动执行此操作。

于 2013-09-07T14:56:46.777 回答
0

在您的情况下,\0 位于 *p 之后的 11 个凹口,而不是 12 个。

于 2013-09-07T14:45:13.150 回答