Отображение вычитания указателя - PullRequest
0 голосов
/ 25 декабря 2018

Хорошо, скажем, у меня есть последовательность "abcdefg", и я делаю

char* s = strdup("abcdefg");
char* p;
char* q;
p = strchr(s, 'c');// -> cdefg
q = strchr(p, 'd');// -> defg

И я хочу отобразить s - p в основном abcdefg - cdefg = ab, могу ли я сделать это с помощью арифметики указателей?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Хорошо, если вам нужно вырезать p из s, следующий код должен работать:

char s[100];  // Use static mutable array
strcpy(s, "abcdefg");  // init array (ok, ok I dont remember the syntax how to init arrays)
char* p = strchr(s, 'c');// -> cdefg
*p = 0;  // cut the found substring off from main string
printf("%s\n", s); // -> ab
0 голосов
/ 25 декабря 2018

Вы можете сделать:

printf("%.*s", (int)(p - s), s);

Это напечатает s с максимальной длиной p - s, которая является количеством символов от s до p.

0 голосов
/ 25 декабря 2018

Вы не можете.Строка сохраняется как последовательность букв, заканчивающаяся нулевым байтом.Если вы напечатаете указатель в виде строки, вы скажете ему распечатать последовательность до нулевого байта, как вы получите cdefg и defg.Нет последовательности байтов с 'a', 'b', 0 - вам нужно скопировать ее в новый массив символов.s - p просто даст вам 2 (расстояние между ними) - нет количества арифметики указателей, которая скопирует последовательность для вас.

Чтобы получить подстроку, см. Строки вC, как получить subString - скопируйте с strncpy, затем поместите нулевой терминатор.

...