Printf неправильно печатает с возвращенным указателем строки - PullRequest
0 голосов
/ 27 июня 2019

Я в полной растерянности.Я пытаюсь изучить C и написал функцию, которая принимает строку, копирует ее в массив, превращая все заглавные буквы в строчные, а затем возвращает указатель на строку.

По всем параметрам код работает.Если я использую printf для печати строки из исходной функции (функция tolowercase ниже), она печатается правильно.Если я перебираю возвращенный указатель массива и печатаю каждый символ индивидуально, это работает (посмотрите в методе main).Я проверил, что нулевой символ присутствует в возвращенном массиве, и это (опять же, в основном методе).

Но, тем не менее, когда я пытаюсь напечатать строку из метода main, он как бы печатает только до определенного количества символов, а затем, для остальных символов, выдает символы мусора, которыене имеет смысла.Это не те символы, которые я вижу, когда перебираю указатель.

Вот код.Я оставил в коде, где вы можете видеть, что я перебрал возвращенный указатель и получил все, что должен:

#include <stdio.h>

int stringlen(char *p);
char *tolowercase(char *p);

int main() {
    char *p;
    p = tolowercase("HELLO THERE I AM REALLY CON");
    for (int i = 0; i < len; i++) {
        printf("%c", *(p+i));
    }
    for (int i = 0; i <= len; i++) {
        printf("%c", *(p+i));
        if (*(p+i) == '\0')
            printf("good");
    }
    printf("\n");
    printf("%s\n", p);
    return 0;
}

int stringlen(char *p) {
    int count = 0;
    while (*(p++) != '\0') {
        count++;
    }
    return count;
}

char *tolowercase(char *p) {
    int len;
    char lower[(len = (stringlen(p) + 1))], *s;
    char *r;
    printf("%d\n", len);
    s = lower;
    r = lower;
    while (*p) {
        if ((*p < 'a') && (*p != ' ')) {
            *s = (*p) + 32;
        } else {
            *s = (*p);
        }
        printf("%c %c ", *p, *s);
        p++, s++;
    }
    *s = '\0';
    printf("%s\n", r);
    return r;
}

Это последний оператор printf в методе main, который дает мне бред.Как уже упоминалось, это, похоже, связано с количеством символов в строке.В какой-то момент, похоже, ничего более 15 символов не нравилось.Теперь это около 26 символов.

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 27 июня 2019

Вы возвращаете указатель на начало вашего локального массива (указатель r, массив lower). Как только функция вернулась, этот массив исчез .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...