РЕДАКТИРОВАТЬ: я понимаю, что код в моем OP является длинным и трудно читаемым.Я выдвинул на первый план проблему с 4 строками кода.
char **t = {"Hello", "World"};
char **a = t;
++(a[0]);
printf("%c\n",**t);
Я хочу увеличивать массив строк без потери указателя на первый символ.Поэтому я инициализирую новый указатель «а», чтобы он указывал на первый символ.Однако после того, как я увеличу указатель 'a', он, похоже, изменит то, на что указывает 't'!В выражении printf я ожидаю, что значение указателя t останется неизменным, но, похоже, оно увеличивается с «a» и теперь указывает на второй символ.Почему это происходит?
ИСПРАВЛЕНО: В приведенном выше примере a и t кажутся одним и тем же указателем, поэтому, если я изменяю один (например, увеличивая), изменение также отражается в другом.Однако, если я разыменую t в другую переменную, то я могу изменить указанную переменную без отражения этого изменения в t.В приведенном выше примере это выглядит так:
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)
тогда функция помечает совпадение, начиная с a
в harp
.
Затем, если я вызываю compString("live", array2, 5)
, функция начинается с a
в harp
и продолжается до концамассива без пометки совпадения.
Наконец, когда я вызываю 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](https://i.stack.imgur.com/awneo.png)