【问题标题】:how to find bit pattern of string in c如何在c中找到字符串的位模式
【发布时间】:2013-04-11 01:30:54
【问题描述】:

我有以下两个问题

  1. 给定这样的语句 char * str = "999999999999";编译器如何确定在堆栈上分配多少空间?

  2. 如何遍历str指向的内存并确定其中各个位的值?

【问题讨论】:

  • 1) sizeof(char*) 在堆栈上。
  • about 1. :在编译时,编译器将能够知道“char”在您的机器和语言环境上代表什么,以及使用多少字节来存储“999999999999”(+终止NULL 字符,它也因机器/实现而异,因此取决于机器)。
  • @OlivierDulac 它是 char * 而不是 char。 char * 应该能够指向任意大小的内存。我有兴趣了解编译器如何确定指向的大小而不是指针本身的大小
  • @Jimm:就像我说的,它知道 1 个字符的大小,以及你给它的“999999999999”静态字符串中有多少个字符,以及终止空值的大小。因此它在编译时就知道它的大小。 (如果我误解了你的评论,请原谅我?)。但是 cmd 是正确的:字符串本身不在堆栈上^^。对不起。

标签: c


【解决方案1】:
  1. "999999999999" 不在堆栈中。指针可能在堆栈上,编译器知道指针应该有多大。 "999999999999" 确实有一个空终止,让您知道它何时结束。

  2. 要遍历每一位,可能是这样的:

    for(i=0; str[i]; i++)  // str[i] will evaluate to false(0) when that character is the null
        for(j=7; j>=0; j--)
            printf("%d", (str[i] >> j) & 0x01)
    

    但我更喜欢以十六进制表示而不是二进制来查看位,所以我只想

    for(i=0; str[i]; i++)
        print("%X ", str[i])
    

【讨论】:

  • 我想要 str 指向的堆上分配的每个字节的位模式
  • "99.." 未在堆上分配。它是一个字符串文字,很可能存在于数据部分中。 This previous question 提供更多信息。
  • @Jimm 更改了位模式
  • sizeof 运算符不返回以位为单位的操作数大小。
  • 大声笑,你们真的很喜欢在几秒钟内捕捉东西
【解决方案2】:

1) 在 C 中,字符串以设置为零的字节结束。因此,在您的示例中,将为该字符串分配 13 个字节 - 12 个字节用于 12 个 ascii 字符,1 个字节用于 '\0' 字符(NULL 终止符)。

2) 你可以迭代它并包含一些按位算术:

for(i = 0; i < strlen(str); i++)
{
    for(j = 7; j >= 0; j--)
     printf("%d", (str[i] & (1 << j)) == 0 ? 0 : 1);
    printf(" ");
}

【讨论】:

  • 从 str[1] 而不是 str[0] 开始的任何特殊原因?
  • @Jimm “第二个字符中的第二位”。您可以使用str[0] 来检查第一个字节内的位。
  • for 循环会给我诸如 '9' 之类的值的位模式吗?
  • @Jimm 检查这个问题的编辑。还有另一个循环来迭代和打印各个位。
【解决方案3】:
  1. 是字符串字面量,编译器可以看到字面量并计算出所需的空间+空终止符

  2. str 是一个指针,它指向您枚举的字符数组中的第一个字符,就像您对任何数组一样。 std 库提供了大量函数来帮助处理字符数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多