C- printf十六进制值给出意外输出

时间:2013-12-30 20:53:42

标签: c printf

我正在尝试学习C的一些基础知识,我一直在阅读关于gets / fgets / puts / scanf的不间断,似乎无法做到这一点......

我的代码是:

#include <string.h>
#include <stdio.h>
#define BUFF 256

void main()
{

char s[BUFF];
fgets(s, BUFF, stdin);
s[strlen(s)-1]='\0';
printf("%x %s %d", s, s, strlen(s));
}   

我正在尝试打印变量s的十六进制格式,我的输入是AAAA,我想要的输出是41414141 AAAA 4,我得到的输出是12fe80 AAAA 4。

我认为我需要为十六进制解释投射s(作为u int),但这也不起作用。

我真的很感激对此的解释以及帮助,我真的很想学习这个。

谢谢!

6 个答案:

答案 0 :(得分:2)

void main()

这不是你的问题,但正确的定义是

int main(void)

void main()主要用作检测由不称职的作者编写的C教科书的工具。

printf("%x %s %d", s, s, strlen(s));

这有不确定的行为:

  • "%x"需要unsigned int类型的参数;你给它一个char*(数组表达式s被转换为指向它的第一个元素的指针。)
  • %d需要int类型的参数;你给它一个size_t。将其转换为int,或使用%zu

如果要打印字符串s内容的十六进制表示,则无法直接执行此操作。您只需循环遍历s中包含的字符,并以十六进制格式打印每个字符的值。 (您应该将每个char值投射到unsigned int,以便它与"%02x"格式一起正常运行。)

答案 1 :(得分:2)

%x适用于数字。你传入一个指向字符串的指针。因此,在这种情况下,printf()将指针(内存地址)解释为数字,并以十六进制格式打印该地址。听起来你只想打印输入中每个字符的ASCII值(十六进制):

for (int i = 0; i < strlen(s); ++i)
    printf("%02x", (unsigned) s[i]);

答案 2 :(得分:1)

您要打印的十六进制值是字符串的地址,而不是内容(因为schar*)。

要将字符串的完整内容视为十六进制字节,您必须执行以下操作:

int n = strlen(s);
for(int ii=0; ii<n; ii++) printf("%02x", (unsigned int) s[ii]);

答案 3 :(得分:1)

试试这个

$ cat hello.c
#include <string.h>
#include <stdio.h>
#define BUFF 256

int main()
{
  int i = 0;              /* a counter */
  char s[BUFF];
  fgets(s, BUFF, stdin);
  s[strlen(s)-1]='\0';
  while (i < strlen(s)) { /* to get the character(s) in s */
    printf("%x", s[i]);   /* as hex */
    i++;
  }
  printf(" %s %d\n", s, strlen(s)); /* as before */
}
$ gcc hello.c -o hello && echo "AAAA" | ./hello
41414141 AAAA 4

答案 4 :(得分:0)

逐个打印所有数组索引。

printf("%x ", *s);
printf("%x ", *(s+1));
....
....

答案 5 :(得分:0)

#include <stdio.h>
#include <string.h>

main() {

    char a[]="AAAA";
    printf("%x%x%x%x %s %d", a[0],a[1],a[2],a[3],a, (int)strlen(a));
}