我正在尝试学习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),但这也不起作用。
我真的很感激对此的解释以及帮助,我真的很想学习这个。
谢谢!
答案 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)
您要打印的十六进制值是字符串的地址,而不是内容(因为s
是char*
)。
要将字符串的完整内容视为十六进制字节,您必须执行以下操作:
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));
}