C-从指针查找数组长度

时间:2018-11-08 16:31:32

标签: c

所以我在这里:

#include <stdio.h>

char halloString[] = "Ha::ll::o";
char perfumeString[] = "47::11";
char veryLongString[] = "47::11::GHesd::dghsr::bfdr:hfgd46dG";

char *extract (char *input) {somethinghappenshere}

其中提取需要获取给定输入的最后一个双“:”之后的所有字符:

  • “ o”代表halloString
  • “ 11”代表香水字符串
  • “ bfdr:hfgd46dG”表示veryLongString

简而言之,我的问题是找到* input指向的字符串的长度。据我了解,如果不做一些真正的粗略的事情就不会发生。

我是否正确假设不能很好地获取长度?

如果这样的话,这将是一个可怕的想法,例如:

char stringToProcessTemp1[50];
char stringToProcessTemp2[50];
char stringToProcess[50];
for (int i = 0; i < 50; i++) {
  stringToProcessTemp1[i] = input + i;
}
for (int i = 0; i < 50; i++) {
  stringToProcessTemp2[i] = input + i;
}
for (int i = 0; i < 50; i++) {
  if (stringToProcessTemp1[i] == stringToProcessTemp2[i]) {
    stringToProcessTemp[i] = stringToProcessTemp1[i];
  }
}

后来检查第一个空索引在哪里并将其之前的所有内容保存为用过的String,这是由于我在C语言中非常有限的经验,当您离开数组时,每次趋向于获得不同的输出,因此有机会获得两个临时字符串在我认为足够低的原始字符串的最后一个之后直接匹配一个额外的元素。

老实说,这是我目前唯一的想法。

2 个答案:

答案 0 :(得分:1)

查找字符串的长度没有问题。 strlen将为您做到这一点。但是,您甚至不需要它。

您可以使用strstr函数在字符串(在本例中为"::")中查找子字符串。当您找到一个时,请一直寻找找到的最后一个,直到找不到为止,然后找到的最后一个就是您想要的那个。然后,您需要紧随其后的子字符串。

char *extract(char *input)
{
    char *last = NULL, *start = input, *curr;
    while ((curr == strstr(start, "::")) != NULL) {
        last = curr;       // keep track of the last "::" found
        start = last + 1;  // move the starting string to right after the last "::"
                           // move up 1 instead of 2 in case of ":::"
    }
    if (last != NULL) {
        last +=2;     // We found one; move just past the "::"
    }
    return last;
}

答案 1 :(得分:0)

C字符串实际上只是一个字符数组,按定义以'\ 0'结尾。因此,对于格式良好的C字符串,您始终可以通过使用strlen()获得字符串的长度。

但是,如果您的字符串不是以Null结尾的,则无法确定其长度,并且按照定义,它不再是C字符串,而只是一个字符数组。