c,c ++最基本的双引号

use*_*640 0 c c++

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是从某个寄存器(或任何内存单元)获取字符串的长度还是执行字符检查..然后打印...

mjs*_*ltz 7

索引字符串的方式很奇怪.它适用于字符串,但不会因为你永远不会改变*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终止符处终止正弦.


And*_*rey 6

你是说还是有错误:

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)
  1. a不会在任何地方修改,因此*a不会改变它的值.
  2. 尽管n[a]在CI中完全有效的构造强烈建议不要使用它,因为它在语义上是不正确的.您可以按索引访问数组,而不是按数组索引.
  3. 你增加index(n++)但检查指向数组的指针.你可以a像这样增加自己:while(*a!=NULL) {printf("%c",*a);a++;}

  • 缺少`{}`for while循环. (2认同)