program
int main()
{
int a=0xabcd;
char *p=&a;
while(p)
{
if(*p=='c')
{
printf("i got %c\n",*p);
return;
}
p++;
}
}
1)为什么我总是得到像"我得到c" 的答案。
2)无论我执行多少次这个程序,为什么我得到%c作为c
3)用任何字符替换c字符,无论如何,为什么我们得到这样一个字符,如果条件,我们放入什么?
if(*p=='z') or if(*p=='t') or ....
4)任何人都可以解释原因是什么?
答案 0 :(得分:5)
int a=0xabcd
将为您提供0x0000abcd
。如果您尝试将此整数的内容作为字符读取,则根据字节顺序,您将获得0x00或0xcd。也不是可打印的ASCII字符。这没有任何意义。
while(p)
表示"而p指向的地址不为零"。这没有任何意义。因此,您继续循环并读取分配的整数之外的随机存储器单元。任何事情都可能发生。如果运气好的话,程序会崩溃。
总而言之,您似乎并不完全知道自己在做什么......
答案 1 :(得分:2)
1)你得到i got c
,因为你的程序有一个指针p
,它指向0xabcd的每个字节,按顺序和超出!在某些时候,指针将指向字节0x63,即' c'。由于这是if
条件,print语句打印 p 指向的char,您会看到消息i got c
。
2)因为if条件仅在 p 指向的字节为0x63时才执行print语句,因此' c'。这就是您始终看到相同消息的原因。但请注意,只有在内存中某处有值为0x63的字节时,它才有效。
3)你会这样写它来显示其他字符。
if((*p=='z') || (*p=='t') || ....)
4)见上面的答案。
答案 2 :(得分:1)
除了 @Lundin 先生的好回答,只是为了澄清 print 的逻辑,
1)为什么我总是得到一个像“我得到c”的答案。
因为,您编写了代码来执行此操作。如果您检查逻辑,请远离程序错误,您编写代码,以便只有printf()
的值等于*p
时才会执行c
。所以,难怪,printf()
(如果遇到)将一直打印
i got c
接下来,
2)无论我执行此程序多少次,为什么我将%c作为c。
正确。与上述原因相同。
3)用任何字符替换c字符,无论如何,为什么我们得到这样一个字符,如果条件我们放入什么?。
如果<{em> printf()
条件满足,则if
只会执行。因此,无论您在if
条件中使用哪种字符,printf()
都只会打印该字符。
答案 3 :(得分:1)
你似乎不知道自己在做什么。
最近的工作问题看起来像这样:
#include <stdio.h>
int main()
{
int a[2] = {0x0a0b0c0d, 0};
char *p = (char *) a;
while (*p)
{
if (*p == 0x0c)
{
printf("i got c\n");
return 0;
}
p++;
}
}
或另一个更好的解决方案:
#include <stdio.h>
int main()
{
int a = 0x0a0b0c0d;
for (int i = 0; i < sizeof (int); i++)
{
if(((char *) &a)[i] == 0x0c)
{
printf("i got c\n");
return 0;
}
}
}