char* a="HELLO WORLD";
Run Code Online (Sandbox Code Playgroud)
如果"H"的地址为0x01,那么带有%s的printf将打印到D但是如果使用手动打印程序写入相同的代码
while(*a!=NULL) {printf("%c",n[a]);n++;}
Run Code Online (Sandbox Code Playgroud)
这会打印出更多的字符..但是
printf("%s",a);
完美打印.
while(*a++) printf("%c", *(a-1)); or
for(;*a++;)printf("%c", *(a-1));
Run Code Online (Sandbox Code Playgroud)
虽然工作,但我不想要解决方案,但过程机制..
所以我想到的问题是
printf是从某个寄存器(或任何内存单元)获取字符串的长度还是执行字符检查..然后打印...
索引字符串的方式很奇怪.它适用于字符串,但不会因为你永远不会改变*a的值而停止.你的程序所做的是尝试获得a偏移量n,因此对于前11个位置它们是相同的,但循环不会终止,因为它*a总是如此'H'.您希望终止条件是什么n < strlen(a).
但是,编写该程序的更简洁的方法是:
int main(int argc, char **argv) {
char *a = "HELLO WORLD";
while(*a) printf("%c", *a++);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是因为a是一个字符数组,当我们打印出每个字符(取消引用存储在该位置的值)时,我们也会增加到下一个位置.该字符串应以NULL引用终止,这将导致循环*a == 0在NULL终止符处终止正弦.
你是说还是有错误:
int main() {
int n = 0;
char* a="HELLO WORLD";
while(a[n] != NULL) {printf("%c",a[n]);n++;}
}
Run Code Online (Sandbox Code Playgroud)
关于错误的解释:
while(*a!=NULL) printf("%c",n[a]);n++;
Run Code Online (Sandbox Code Playgroud)
a不会在任何地方修改,因此*a不会改变它的值.n[a]在CI中完全有效的构造强烈建议不要使用它,因为它在语义上是不正确的.您可以按索引访问数组,而不是按数组索引.n++)但检查指向数组的指针.你可以a像这样增加自己:while(*a!=NULL) {printf("%c",*a);a++;}