如何在c语言中找到字符串的位模式

如何在c语言中找到字符串的位模式,c,C,我有以下两个问题 给定像char*str=“9999999999”这样的语句;编译器如何决定在堆栈上分配多少空间 如何遍历str指向的内存并确定内存中各个位的值 “9999999999”不在堆栈上。指针可能在堆栈上,编译器知道指针应该有多大。“99999999999”实际上有一个空终止符,可以让您知道它何时在末尾 要在每个位上迭代,可能类似于: for(i=0; str[i]; i++) // str[i] will evaluate to false(0) when that charact

我有以下两个问题

  • 给定像char*str=“9999999999”这样的语句;编译器如何决定在堆栈上分配多少空间

  • 如何遍历str指向的内存并确定内存中各个位的值

  • “9999999999”
    不在堆栈上。指针可能在堆栈上,编译器知道指针应该有多大。
    “99999999999”
    实际上有一个空终止符,可以让您知道它何时在末尾

  • 要在每个位上迭代,可能类似于:

    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])
    
  • 是一个字符串literal,编译器可以看到文本并计算所需的空间+空终止符

  • str是一个指针,它指向枚举的字符数组中的第一个字符,就像指向任何数组一样。std库提供了一系列函数来帮助处理字符数组

  • 1) 在C语言中,字符串由设置为零的字节终止。因此,在您的示例中,将为该字符串分配13个字节-12个字节用于12个ascii字符,一个字节用于“\0”字符(空终止符)

    2) 您可以对其进行迭代,并包括一些位算术:

    for(i = 0; i < strlen(str); i++)
    {
        for(j = 7; j >= 0; j--)
         printf("%d", (str[i] & (1 << j)) == 0 ? 0 : 1);
        printf(" ");
    }
    
    for(i=0;i=0;j--)
    
    堆栈上的printf(“%d”)、(str[i]&(11)sizeof(char*)。大约1:在编译时,编译器将能够知道“char”在您的计算机和语言环境中代表什么,以及用于存储“9999999999999”的字节数(+终止的空字符,它也因计算机/实现而异,因此依赖于计算机)@OlivierDulac它是char*而不是char。char*应该能够指向任意大小的内存。我感兴趣的是了解编译器如何确定指针的指向大小而不是大小itself@Jimm:如我所说,它知道1个字符的大小,以及“9999999999”中有多少个字符你给它的静态字符串,以及终止null的大小。因此,它在编译时知道它的大小。(如果我误解了你的评论,请原谅我?)。但是cmd是正确的:字符串本身不在堆栈上^^。对不起。有什么特别的原因要从str[1]开始而不是str[0]?@Jimm“第二个字符中的第二位”。您可以使用
    str[0]
    检查第一个字节内的位。for循环是否会给我诸如“9”之类的值的位模式?@Jimm检查此问题的编辑。还有另一个循环用于迭代和打印单个位。我希望str
    “99..”指向的堆上分配的每个字节的位模式
    不是在堆上分配的。它是一个字符串文字,可能存在于数据节中。提供了更多信息。@Jimm更改了位模式
    sizeof
    运算符不返回以位为单位的操作数大小。lol,你们真的很喜欢在几秒钟内捕获内容