Возможно ли получить доступ к указателю в «рекурсивном режиме»? - PullRequest
1 голос
/ 30 марта 2012

Есть ли в языке C способ сделать что-то вроде:

/* it's a demo code. I know that it doesn't work. */
char foo[] = "abc";
char* p = &foo[0];
int len = 3;

while(len) {
    printf("%c", *p);
    p--;
    len--;
}

и получите cba вывод?

Мой вопрос: есть ли простой способ сделать это? возможно, используя арифметические указатели. Я знаю, что могу написать такую ​​функцию:

/* Note: I haven't tested the this code. But I believe that works. */
char *strrev(char input[]) {
    if (input == NULL) return NULL;

    int len = strlen(input) - 1;
    char * rev = malloc(len+1);

    if (rev == NULL) return NULL;

    for (; len != 0; len--) *rev++ = input[len];

    if (len == 0) {
      *rev++= '\0';
       return rev;
    } else {
       free(rev);     
       return NULL;
    }   
}

Но я ищу более простой способ, мне нужно написать функцию, которая начинает сравнения с полустроки * * 1010

Ответы [ 6 ]

1 голос
/ 30 марта 2012
void backwards_print(const char *text) {
    /* don't even try to print an empty string */
    if (*text) {
        const char *p = text;

        /* go to the end */
        while (*p++) /* void */;

        /* print from the end */
        while (p != text) putchar(*--p);

    }
    putchar('\n'); /* newline, flush buffer */
}

Пример использования

char foo[] = "abc";
backwards_print(foo);
0 голосов
/ 30 марта 2012

Из того, что я прочитал, вам нужна такая функция:

// returns a pointer to the start of 'dst'
// assumes dst has a length = strlen(str) + 1 or more
// also assumes that dst and src are not NULL.
char *strmidrev(char *dst, const char *src)
{
    int length = strlen(src);
    int mid = length / 2;

    for (int i = 0; i < length; i++) {
        dst[i] = src[((i + mid) % length)];
    }

    // NUL terminate the string
    dst[length] = '\0';

    return dst;
}
0 голосов
/ 30 марта 2012

Вы хотите проложить себе путь к середине с обоих концов, как это?

len = strlen(input) - 1;
for (i = 0; i <= len/2; ++i) {
  char c = input[i];
  input[i] = input[len - i];
  input[len - i] = c;
}
0 голосов
/ 30 марта 2012

Если вам нужно вращение,



int index = 1;
static const int kArraySize = sizeof(foo) / sizeof(char);

while(len) {
    printf("%c", p[index++ % kArraySize]);
    len--;
}

Это выведет bca.Если вы хотите разворот, он будет другим.

К вашему сведению, я бы закодировал эти циклы немного по-другому, если бы это был мой код, но я хотел максимально использовать ваш код.

0 голосов
/ 30 марта 2012

Для начала, в начале цикла while p указывает на первый символ iea. Затем вы переходите к символу раньше - которого не существует!

Также - Джек -Зачем ставить код, который вы еще не пробовали?

0 голосов
/ 30 марта 2012
start p at foo[2] and loop while(p >= &foo[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...