【问题标题】:C- Find array length from pointerC-从指针中查找数组长度
【发布时间】:2018-11-08 16:31:32
【问题描述】:

所以我在这里得到了这个:

#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}

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

  • halloString 的“o”
  • 香水串的“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];
  }
}

稍后检查第一个空索引的位置并将其之​​前的所有内容保存为使用的字符串,因为我在 C 语言中的经验非常有限,当您离开数组时,您往往每次都会得到不同的输出,因此有机会同时使用 Temp 字符串在我认为足够低的原始字符串的最后一个之后直接匹配一个额外的元素。

老实说,这是我现在唯一的想法。

【问题讨论】:

  • 你的问题是,如何找到最后一次出现的"::" 或者如何找到字符串的长度?
  • 在这种情况下您可以使用strlen,因为您使用的是字符串。
  • 您说的是当您访问数组末尾时字符串匹配的“机会”。这是一种非常危险的心态;您需要了解访问数组末尾之后是未定义的行为,并且标准说 anything 可能发生。
  • 这似乎是一个 XY 问题(而不是 XY 问题,而不仅仅是一个问题)。 @FiddlingBits 正在像我一样阅读问题;看来您需要一种方法来回溯您的字符串以查找分隔符并在此过程中组装您的结果。要么这样,要么我们都遭受同样的错觉(一种明显的可能性)。

标签: c


【解决方案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;
}

【讨论】:

  • 唯一的问题是如果字符串以“::”结尾,它会返回一个指向某个内存的指针,它可能是任何东西。但我想这对 OP 来说并不重要
  • 感谢您提及 strstr。我将尝试使用 strlen 和 strstr 制作两个解决方案,看看哪个更适合我。 @MilosMatovic 这应该不是问题,但也感谢您提及它。如果我有时间,我会添加一个以“::”结尾的字符串,并尝试将其修复为额外的练习。
  • @MilosMatovic 在这种情况下,它返回一个指向字符串末尾的空终止符的指针,即一个空字符串。
【解决方案2】:

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

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

【讨论】:

  • 如果字符串的格式不正确,它可能会丢失尾随空字节。在这种情况下,条件读取 (if pointer[i]) 读取将引发警告,并且读取/写入会导致 undefined behaviorSegmentation Fault (Core Dumped)
  • “C 字符串,...根据定义以 '\0' 终止”和“如果,...,您的 C 字符串不是以空值终止的,”相矛盾。为清楚起见:字符数组可能缺少 null 字符。在 C 中,string 总是有一个 null 字符
  • @chux 哈哈,语言律师?我会编辑我的帖子。谢谢。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多