2010-08-03 70 views
0
char* a="HELLO WORLD"; 

IF的 'H' ADDRESS为0x01,则printf的与%s打印到d,但如果相同的代码被写入与手动打印例程C,C++最基本的双引号

while(*a!=NULL) {printf("%c",n[a]);n++;} 

此打印几个字符.. 但

printf("%s",a);

打印它完美。

while(*a++) printf("%c", *(a-1)); or 

for(;*a++;)printf("%c", *(a-1)); 

虽然工作,但我不想解决方案,但这一过程的机制..

所以来到我脑海中的问题是

的printf是否会从一些寄存器中的字符串的长度(或任何存储单元) 或者执行字符检查..然后打印...

+0

我可能有一些代码错误吧...如果ü可以忽略他们... – user409640 2010-08-03 12:53:01

+5

我想你可能就是。 – Lazarus 2010-08-03 12:54:28

+0

什么是n?请提供完整的代码示例。 – 2010-08-03 12:55:23

回答

6

你的意思,或者你有错误:

int main() { 
    int n = 0; 
    char* a="HELLO WORLD"; 

    while(a[n] != NULL) {printf("%c",a[n]);n++;} 
} 

解释一下什么是错的:

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

缺少用于while循环的{}。 – Naveen 2010-08-03 13:00:53

+0

@Naveen:很好。否则它将永远打印H直到失败。 – 2010-08-03 13:09:57

+0

+1为好的答案,但你应该解释**为什么**你的代码是正确的。 – 2010-08-03 13:10:41

7

你索引到字符串的方式很奇怪。它适用于字符串,但不会停止,因为您永远不会更改* a的值。你的程序做的是试图得到na偏移量,所以对于前11个位置它们是相同的,但是循环不终止,因为*a将始终为'H'。你想要的终止条件是n < strlen(a)

然而,编写程序更简洁的方法是:

int main(int argc, char **argv) { 
    char *a = "HELLO WORLD"; 
    while(*a) printf("%c", *a++); 
    return 0; 
} 

这工作,因为a是字符数组和我们打印出的每个字符(取消引用存储在值位置),我们也增加到下一个位置。该字符串应该以NULL引用终止,这将导致循环在NULL终止符处终止正弦*a == 0

+1

+1我认为这是一个很好的答案,因为它不需要另一个整数计数值并使用指针运算 – 2010-08-03 13:13:18

0

的corect方式做到这一点是:

#include <iostream> 
using namespace std; 

int main() { 
    char *a="HELLO WORLD"; 
    int n = 0; 
    while(a[n]!=NULL){ 
     cout<<a[n]; 
     n++; 
    } 

    cout<<'\n'; 
    return 0; 
} 
+0

+1:C++,不只是C答案。 – Puppy 2010-08-03 13:19:06

+0

@cristy: - 请阅读整个问题第一.. 如果我是用C++ ... 的#include 的#include 的typedef的std :: string字符串; (){ String afg =“HELLO WORLD”; \t std :: cout << afg; return 0; } – user409640 2010-08-03 13:51:03

+0

@ porgramming-tornado 我不明白你在说什么?你没有在你的问题中提及任何编程语言,标签上写着:“C++,c”...所以我认为C++版本会有所帮助。 您的实际问题没有意义,因为您的程序无法正常工作,原因是您通过字符串进行了奇怪的迭代。你使用的“n”我认为你想用整数来迭代,但是当你写“n [a]”时没有意义...... – Cristy 2010-08-03 14:03:14

-1

至于我记得,在默认情况下,当你在内存中创建char* a这将是东西为{HELLO WORLD\0}(“\ 0”是多么%S知道在你的字符串的结尾是)..

不知道'\0' == null将产生真正的..但我怀疑

+0

它会。此外,它是NULL。 – Phil 2010-08-03 13:33:50

+0

@Phil:整数值0不是空指针常量。特别是,即使他在代码中递增'a','* a!= NULL'也是错误的条件,因为'* a'不是指针类型。在编译器的指针上下文中,'0'被转换为空指针常量,但不是相反。 – 2010-08-03 13:53:22

+0

@Alok:OP令人困惑的是C和C++。在C++中,NULL是空指针常量,它是一个常量积分为0的宏。可能是'0L',可能是'false',但通常只是'0'。所以它有效。 – MSalters 2010-08-03 14:07:34