gpt4 book ai didi

c - 迭代迭代字符串数组(指针值似乎得到 "stuck")

转载 作者:行者123 更新时间:2023-11-30 14:43:37 28 4
gpt4 key购买 nike

编辑:我意识到我的OP中的代码又长又难读。我用 4 行代码突出显示了这个问题。

char **t = {"Hello", "World"};
char **a = t;
++(a[0]);
printf("%c\n",**t);

我想在字符串数组中递增而不丢失指向第一个字符的指针。因此,我初始化一个新指针“a”以指向第一个字符。然而,在我增加“a”指针之后,它似乎改变了“t”指向的内容!在 printf 语句中,我希望 t 的指针值保持不变,但它似乎随着“a”增加,现在指向第二个字符。为什么会发生这种情况?

已解决:在上面的示例中,a 和 t 似乎是相同的指针,因此如果我更改一个指针(例如通过递增),则更改也会反射(reflect)在 pther 中。但是,如果我将 t 取消引用到另一个变量中,那么我可以更改该变量,而不会在 t 中反射(reflect)该更改。在上面的示例中,这看起来像

char *a = t[0];
++a;
printf("a value: %c\n", *a);
printf("t value: %c\n", **t);

我认为我最初对取消引用感到困惑,因为 t 指向一个指针。我收到的每个回复都是使用数组索引而不是指针,我明白为什么。

原帖:假设我有:

array1 {"arp", "live", "strong"}, and 
array2 {"lively", "alive", "harp", "sharp", "armstrong"}

我正在尝试查找 array1 中的字符串,这些字符串是 array2 中任何字符串的子字符串。

为此,我编写了一个辅助函数 (compString),它接收 array1 中的字符串、整个 array2 以及array2 的长度。

本质上,该函数的作用是为字符串指针和数组指针创建本地指针值。然后,它从 array2 中提取第一个字符串,并开始遍历它以查找输入字符串第一个字母的匹配项。如果未找到匹配项,该函数将继续处理下一个字符串,直到找到完全匹配项或遍历整个array2。然后它返回到其调用环境。

我遇到了一些意想不到的行为。当我调用该函数(使用相同的参数)时,在调用它之后,数组指针似乎准确指向它在上一次调用中停止的位置。

例如,如果我调用 compString("arp", array2, 5) 那么该函数将标记从 harp< 中的 a 开始的匹配.

然后,如果我调用 compString("live", array2, 5),该函数会从 harp 中的 a 开始,然后执行到数组末尾而不标记匹配。

最后,当我调用 compString("strong", array2, 5) 时,array2 现在指向垃圾,因为它已经被迭代过,并且没有标记一场比赛。

因为辅助函数所做的第一件事就是“本地化”正在传递的指针(即创建一个本地指针变量并将传递给函数的指针的值分配给它,然后迭代该本地变量),我假设对该函数的后续调用不会“保存”指针的先前值。有什么指点吗?

附来源:

#include <stdio.h>
#include <string.h>

int compString(char *, char **, int);

int main(void)
{
int sz1 = 3;
int sz2 = 5;
char *p, *p2;
char *array1[] = {"arp\0", "live\0", "strong\0"};
char *array2[] = {"lively\0", "alive\0", "harp\0", "sharp\0", "armstrong\0"};

compString("arp\0",array2,5);
compString("live\0",array2,5);
compString("strong\0",array2,5);
}

int compString(char *arr1, char **arr2, int sz2)
{
printf("\n\n\n");
printf("WORD: %s\n",arr1);
int i = 0;
char *a1 = arr1;
char **a2 = arr2;
char *p;
char *p2;

printf("BEGIN ITERATION %d\n",i);
printf("Checking against word: %s\n",a2[i]);
while (i < sz2)
{
printf("%c\n",*a2[i]);
if (*a1 == *a2[i])
{
char *p = a1;
char *p2 = a2[i];

while ((*p == *p2) && (*p != '\0'))
{
++p;
++p2;
}

if (*p == '\0')
{
return 1;
}

else
{
*++(a2[i]);
if (*(a2[i]) == '\0')
{
++i;
printf("BEGIN ITERATION %d\n",i);
printf("Checking against word: %s\n",a2[i]);
}
}
}

else
{
*++(a2[i]);
if (*(a2[i]) == '\0')
{
++i;
printf("BEGIN ITERATION %d\n",i);
printf("Checking against word: %s\n",a2[i]);
}
}
}
return 0;
}

sample output

最佳答案

您的循环导致了相差一错误。你想要做的是循环遍历你的 5 个字符串数组,所以从 0 到 4。我们可以看到,当你运行所有三个测试时,因为它们在某种程度上依赖于彼此的结果(我也没有研究比较逻辑很多,看起来相当困惑)。

我们只需一次测试即可复制该行为:

compString("test", array2, 5);

所以5应该告诉它从 0 到 4 循环。在比较函数中,你有这个:

int i = 0;
printf("BEGIN ITERATION %d\n", i);
printf("Checking against word: %s\n", a2[i]);
while (i < sz2)

到目前为止,一切都很好。 i < sz2是正确的,它应该从 0 循环至4 ,假设您增加 i正确。

但是,您可以在函数末尾的某个位置执行此操作:

++i;
printf("BEGIN ITERATION %d\n", i);
printf("Checking against word: %s\n", a2[i]);

所以当 i4 ,将其增加到 5 ,此时该函数应该停止循环遍历数组,但此时您执行尝试访问 a2[5] 的 print 操作。 ,它不存在。这就是我在 MSVC 上崩溃的地方。

我的建议是您将循环逻辑重新设计为如下所示:

for (int i = 0; i < sz2, i++){
printf("BEGIN ITERATION %d\n", i);
printf("Checking against word: %s\n", a2[i]);
// do something with a2[i] and don't manually change the value of "i"
}

此外,我会整理该字符串逻辑,其中某处可能存在错误。您不需要所有这些可疑的取消引用调用。当你想访问字符x时字符串ya2 ,然后a2[y][x]就可以了。例如,如果您想查找某个字母,只需执行以下操作:

for (int n = 0; n < strlen(a2[y]), n++){
if (a2[y][n] == 'a')
printf("found letter 'a' at position %d\n", n);
}

此外,您不需要添加 \0字符串文字。这些是自动添加的,因此您只需添加第二个即可。而不是这个:

char *array1[] = {"arp\0", "live\0", "strong\0"};

这样做:

char *array1[] = {"arp", "live", "strong"};

另外,我不知道你是否必须实现这个函数,因为这是一个给你的任务,但如果你只是想找到子字符串,那么你不需要像strstr那样重新发明轮子。已经这样做了。

关于c - 迭代迭代字符串数组(指针值似乎得到 "stuck"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53830172/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com