【问题标题】:How can i printf ascii code using other variable?如何使用其他变量打印 ascii 代码?
【发布时间】:2017-07-15 09:00:57
【问题描述】:

我正在学习 C 语言。

这是我的代码

int main(void)
{
    char * character = "abcd";

    printf("%d \n", *character);

    int num = character;
    int * pnum = #

    printf("%s \n", * pnum);

    return 0;
}

我得到的结果如下: 97 和 abcd 。

我了解到 97 是 'a' 的 ascii 代码。

我想要使用 pnum 变量的结果 97,

所以我尝试了printf("%d", pnum)printf("%d", *pnum) 或其他东西。

但我还不能从 pnumnum 得到 97。

如何使用pnumnum 获得97?

【问题讨论】:

  • int num = *character; int * pnum = # printf("%d \n", * pnum);
  • %s 需要一个指针,所以你必须使用:printf("%s \n", pnum); 更好,你使用char * pnum; 和一个演员:*pnum = (char *) #

标签: c string pointers type-conversion


【解决方案1】:

通常程序具有未定义的行为 . 根据 C 标准(6.3.2.3 指针)

6 任何指针类型都可以转换为整数类型。除了作为 之前指定的,结果是实现定义的。 如果 结果不能用整数类型表示,行为是 未定义。 结果不必在任何值的范围内 整数类型。

例如,sizeof( char * ) 可以等于 8,而sizeof( int ) 可以等于 4。即 int 类型的对象无法存储指针的值。

而不是此声明中的 int 类型

int num = character;

您应该使用在标头<stdint.h> 中声明的类型intptr_t

例如

#include <stdint.h>

//...

intptr_t num = ( intptr_t )character;

所以现在变量 num 包含字符串文字 "abcd" 的第一个字符的地址。

在此声明之后

intptr_t *pnum = &num;

指针pnum拥有变量num的地址。

现在要输出字符串文字的第一个字符,首先要取消引用指针pnum,以获取存储在变量num 中的值。该值表示字符串文字的第一个字符的地址。您需要将其转换为 char * 类型并再次取消引用它。

下面是一个演示程序,展示了如何实现它。如果您不取消引用指针,则将输出整个字符串文字。

#include <stdio.h>
#include <stdint.h>


int main(void) 
{
    char *character = "abcd";

    printf( "%d\n", *character);

    intptr_t num = ( intptr_t )character;
    intptr_t *pnum = &num;

    printf( "%s\n", ( char * )*pnum );
    printf( "%d\n", *( char * )*pnum );

    return 0;
}

程序输出是

97
abcd
97

【讨论】:

  • 感谢您的回答
【解决方案2】:

使用int *pnum 变量无法得到结果,因为它是一个指针,并且它没有指向int 值97。

事实上,在你的程序内存中没有任何地方存储int 值 97;有一个地方存储了 char 值 97,但您不能将 int 指针指向它。当然,在解除引用之前,您始终可以将 pnum 转换回 char*,但这与您的第一个 printf 相同:

printf("%d", *((char*)pnum));

如果要将 97 放入整数变量中,请使用 num 而不是 pnum

int num = *character;

这会将'a'char 值转换为其int 代码(系统上的97)。现在你可以指向它,或者直接打印结果:

int *pnum = &num;
printf("%d %d\n", num, *pnum);

【讨论】:

  • 感谢您的回答
【解决方案3】:

您可以参考: http://www.cplusplus.com/reference/cstdio/printf/

现在我们知道了格式说明符:

  • d 有符号十进制整数
  • i 有符号十进制整数
  • u 无符号十进制整数
  • o 无符号八进制
  • x 无符号十六进制整数
  • X 无符号十六进制整数(大写)
  • f 十进制浮点数,小写
  • F 十进制浮点数,大写
  • e 科学记数法(尾数/指数),小写
  • E 科学记数法(尾数/指数),大写
  • c 字符
  • s 字符串
  • p 指针地址

所以,获取代码:

int main(void)
{
    char * chrs = "abcd";
    char * pnum = chrs;
    int num = *chrs;

    printf("%c - %d - %d \n", *chrs, num, *pnum);
    return 0;
}

【讨论】:

  • 为什么在回答 C 问题时链接 C++ 参考?尽管这可能在非常特殊的情况下有效,但 C++ 和 C 仍然是不同的语言。
  • 感谢您的回答
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2020-08-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多