【问题标题】:In C, what does it actually do when you input a string but print it out as integer?在 C 中,当您输入一个字符串但将其打印为整数时,它实际上会做什么?
【发布时间】:2021-09-14 08:28:50
【问题描述】:

在下面的这段代码中,我输入了一个字符串,但将其转换为整数并打印出来。

int main ()
{
   int v6[4];
   printf ("Enter a string: ");
   int i = scanf ("%s",v6);  
   printf ("%d ",v6[0]);
  
  return 0;
}

输出:

Enter a string: tom
7171956

它实际上做了什么?

【问题讨论】:

  • 这里没有进行任何转换。
  • int v6[4]; 是作为%s 目标的错误类型。
  • 启用编译器警告(例如gcc -Wall -Werror ...)并修复所有警告
  • @4386427 OP 声称他“已将其转换为整数”,但 此处没有进行任何转换。
  • @4386427 非常好。我认为我们可以删除与此相关的 cmets。

标签: arrays c string


【解决方案1】:

回答你的问题

7171956

将其转换为十六进制

0x6d6f74

检查 ascii 表

mot

您已经用 tom 的 ascii 表示填充了内存,然后您将其作为整数读取,同时考虑到字节顺序。

【讨论】:

    【解决方案2】:

    这可能发生在这里:(假设 int 在您的平台上是 32 位类型):

    int v6[4] 在内存中占用 16 个字节。

    scanftom 作为输入之后,v6 的前 n 个字节如下所示:(x 是一个未确定的值)。

    +-----+-----+-----+-----+-----+-----+-----+-----+----
    | 't' | 'o' | 'm' |  0  |  x  |  x  |  x  |  x  | ...
    +-----+-----+-----+-----+-----+-----+-----+-----+----
    

    十六进制的相同内容(0x74 是字母 't' 等的 ASCII 码):

    +-----+-----+-----+-----+-----+-----+-----+-----+----
    | 74  |  6F |  6D |  0  |  x  |  x  |  x  |  x  | ...
    +-----+-----+-----+-----+-----+-----+-----+-----+----
    

    0x6d6f74(即v6[0])转换为十进制的值为7171956

    请注意,在 big endian(谷歌该术语)架构中,v[0] 将是 0x746f6d00

    但是不要做这些事情,这是未定义的行为(也是谷歌)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多