%s格式用于查找字符串

时间:2017-07-17 10:58:22

标签: c printf

#include<stdio.h>
void main()
{
     char a[]="get organized learn c!";
     printf("%s",&a[2]);
}

我得到了输出:

t organized learn c!

它应该给出错误,因为我使用&amp;对于%s

3 个答案:

答案 0 :(得分:4)

不,您的代码表现正常。

  • achar类型的数组。它与char *
  • 兼容
  • a[2]是一个char
  • &a[2]char *,指向数组中的第三个字符。它相当于a + 2

答案 1 :(得分:1)

它不应该出错 - 代码中的printf正常工作。

您无法单独查看&运算符的地址,并确定其生成的结果无效,因为表达式的其余部分也很重要。在您的情况下,&运算符应用于a[2],因此它采用字符串中第三个字符的地址。这是有效的,只要您的以null结尾的字符串至少包含两个字符,而字符串就是这样。

get organized learn c!\0
^ ^                    ^
| |                    +- null terminator
| +---------------------- &a[2] points here
+------------------------ a, interpreted as a pointer, points here

如您所见,a&a[2]都指向有效的以null结尾的C字符串。在你的情况下,字符串重叠,但C不禁止它。

答案 2 :(得分:0)

错误不在您预期的位置:

  • main没有参数的原型应为int main(void)

  • 对于好的风格,main应该明确返回0。

  • 对于转换说明符%sprintf需要一个指向空终止字符串的指针。 &a[2]a中第三个字节的地址,它是char的有效a指针,即空终止字符串"t organized learnc!",没有错误这里。

您可以将a + 22 + a&2[a]写成具有相同的确切含义。

#include <stdio.h>
int main(void) {
     char a[] = "get organized learn c!";
     printf("%s\n", &a[2]);
     return 0;
}