Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 找出字符串数组长度和每个字符串的长度_C_Arrays_Pointers_Char_Size - Fatal编程技术网

C 找出字符串数组长度和每个字符串的长度

C 找出字符串数组长度和每个字符串的长度,c,arrays,pointers,char,size,C,Arrays,Pointers,Char,Size,考虑C中的以下“字符串”数组: 是否有可能获得: animals数组中的元素数(字符指针) 每个数组成员的长度,即元素0的大小=1,元素1的大小=4,依此类推 当然,我试过使用sizeof,但它似乎没有返回任何有意义的结果。我认为预编译器应该能够计算出数组中元素的数量以及每个元素的大小。对于后者,还可以定义\0字符的长度。但是,我想知道为什么在使用sizeof时,我无法获得正确的数组大小(即animals数组中的元素数) 我将感谢所有建议 编辑: 是的,我是说预处理器,不是预编译器,对不起 为什

考虑C中的以下“字符串”数组:

是否有可能获得:

  • animals
    数组中的元素数(字符指针)

  • 每个数组成员的长度,即元素0的大小=1,元素1的大小=4,依此类推

  • 当然,我试过使用
    sizeof
    ,但它似乎没有返回任何有意义的结果。我认为预编译器应该能够计算出数组中元素的数量以及每个元素的大小。对于后者,还可以定义
    \0
    字符的长度。但是,我想知道为什么在使用
    sizeof
    时,我无法获得正确的数组大小(即
    animals
    数组中的元素数)

    我将感谢所有建议

    编辑:

  • 是的,我是说预处理器,不是预编译器,对不起

  • 为什么我需要这个功能? 我正在解析来自串行端口的传入字符串。我需要确定收到的字符串是否与预配置表中的任何字符串匹配。如果有,我需要该项的索引。我需要快速的搜索算法。因此,我首先要检查字符串大小以及之后的所有字节,前提是大小匹配。因此,我认为每个字符串的长度在编译时是已知的

  • 这是我当前的检查功能:

    static int32_t  getStringIndex(const uint8_t* const buf, const uint32_t len)
    {
        if (!len)
            return -1;
    
        int32_t arraySize = sizeof(animals) /  sizeof(animals[0]);
        uint32_t elementSize;
    
        // The algorithm 1st checks if the length matches. If yes, it compares the strings.
        for (int32_t i = 0; i < arraySize; i++)
        {
            elementSize = strlen(animals[i]);
    
            if (elementSize == len)
            {
                if (0 == memcmp(animals[i], buf, len))
                {
                    return i;
                }
            }
        }
    
        return -1;
    }
    
    static int32\u t getStringIndex(const uint8\u t*const buf,const uint32\u t len)
    {
    如果(!len)
    返回-1;
    int32_t arraySize=sizeof(动物)/sizeof(动物[0]);
    uint32_t元素大小;
    //算法首先检查长度是否匹配。如果匹配,则比较字符串。
    对于(int32_t i=0;i
    我不使用strcmp,因为
    buf
    末尾没有
    \0

  • sizeof animals/sizeof*animals
    (总大小(字节)除以单个元素的大小)

  • strlen(动物[0])+1
    (字符串长度不包括
    0
    终止符)

  • sizeof animals/sizeof*animals
    (总大小(字节)除以单个元素的大小)

  • strlen(动物[0])+1
    (字符串长度不包括
    0
    终止符)

  • 返回数组中的元素数

    您还可以使用
    strlen()
    获取数组中每个元素的长度

    来自标准第7.24.6.3节

    strlen
    函数返回前面的字符数 终止的空字符

    另外,
    sizeof
    是一个运算符

    来自标准第6.5.3.4节

    sizeof
    运算符的另一个用途是计算
    数组中的元素

    返回数组中的元素数

    您还可以使用
    strlen()
    获取数组中每个元素的长度

    来自标准第7.24.6.3节

    strlen
    函数返回前面的字符数 终止的空字符

    另外,
    sizeof
    是一个运算符

    来自标准第6.5.3.4节

    sizeof
    运算符的另一个用途是计算
    数组中的元素


    您可以使用预处理器构建包含长度和字符串指针的结构数组,如下所示:

    #include <stdio.h>
    
    struct animalentry
    {
      int size;
      const char* const name;
    };
    
    #define ANIMAL_ENTRY(a) { sizeof a - 1, a },
    
    const struct animalentry animals[] =
    {
      ANIMAL_ENTRY("")
      ANIMAL_ENTRY("Cat")
      ANIMAL_ENTRY("Dawg")
      ANIMAL_ENTRY("Tiger")
    };
    
    int main()
    {
      for (int i = 0; i < sizeof animals / sizeof animals[0]; i++)
      {
        printf("Name = %s, length = %d\n", animals[i].name, animals[i].size);
      }  
    }
    

    这应该很容易适应您的
    getStringIndex
    函数。

    您可以使用预处理器构建一个包含长度和字符串指针的结构数组,如下所示:

    #include <stdio.h>
    
    struct animalentry
    {
      int size;
      const char* const name;
    };
    
    #define ANIMAL_ENTRY(a) { sizeof a - 1, a },
    
    const struct animalentry animals[] =
    {
      ANIMAL_ENTRY("")
      ANIMAL_ENTRY("Cat")
      ANIMAL_ENTRY("Dawg")
      ANIMAL_ENTRY("Tiger")
    };
    
    int main()
    {
      for (int i = 0; i < sizeof animals / sizeof animals[0]; i++)
      {
        printf("Name = %s, length = %d\n", animals[i].name, animals[i].size);
      }  
    }
    

    这应该很容易适应您的
    getStringIndex
    功能。

    您可以使用
    sizeof(动物)/sizeof(*动物)
    获取动物数量(包括您可能不应该拥有的初始“空”动物)。您可以使用
    strlen(动物[i])
    获取单个动物名称的长度。没有预编译程序。如果你指的是预处理器,那么答案是否定的。预处理器只做文本替换,它不知道变量的大小。也许你应该告诉我们为什么你需要知道。您的用例是什么?我已经编辑了我的问题。您可以在程序初始化期间一次性地计算
    animals
    中字符串的长度,因此您不需要反复调用
    strlen
    。我认为你不能得到数组中字符串文字的长度(例如,
    sizeof(animals[2])
    不是strig的长度,而是指针的大小)。实际上这是个好主意。你可以使用
    sizeof(animals)/sizeof(*animals)
    来获得动物的数量(包括首字母“empty”)你可能不应该拥有的动物)。您可以使用
    strlen(动物[i])
    获取单个动物名称的长度。没有预编译程序。如果你指的是预处理器,那么答案是否定的。预处理器只做文本替换,它不知道变量的大小。也许你应该告诉我们为什么你需要知道。您的用例是什么?我已经编辑了我的问题。您可以在程序初始化期间一次性地计算
    animals
    中字符串的长度,因此您不需要反复调用
    strlen
    。我认为您无法获得数组中字符串文字的长度(例如,
    sizeof(animals[2])
    不会是长度
         sizeof array / sizeof array[0]
    
    #include <stdio.h>
    
    struct animalentry
    {
      int size;
      const char* const name;
    };
    
    #define ANIMAL_ENTRY(a) { sizeof a - 1, a },
    
    const struct animalentry animals[] =
    {
      ANIMAL_ENTRY("")
      ANIMAL_ENTRY("Cat")
      ANIMAL_ENTRY("Dawg")
      ANIMAL_ENTRY("Tiger")
    };
    
    int main()
    {
      for (int i = 0; i < sizeof animals / sizeof animals[0]; i++)
      {
        printf("Name = %s, length = %d\n", animals[i].name, animals[i].size);
      }  
    }
    
    Name = , length = 0
    Name = Cat, length = 3
    Name = Dawg, length = 4
    Name = Tiger, length = 5