Почему subStr (charArr, 0, strlen (charArr)) и charArr имеют одинаковый вывод при использовании printf, но различаются при передаче в функцию? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть функция getCoefnExpo (), чтобы получить коэффициенты и показатели степени x в выражении a + bx.Ожидаемые: a, 0, b, 1

Моя функция subStr ():

char * subStr(char s[], int start, int stop) {
    int c = 0;
    static char sub[100];
    while (start + c < stop) {
        sub[c] = s[start + c];
        c++;
    }
    sub[c] = '\0';
    return sub;
}
char s[] = "01234";
printf("%s\n", subStr(s, 1, 4)); // 123
void getCoefnExpo(char s[], float container[], int &n) {
    int len = strlen(s);
    int pos = 0;
    for (int i = 0; i < len; i++) {
        char found[100];
        if (i == 0 && s[i] == 'x') {
            container[pos++] = 1;
            if (s[i + 1] != '^') container[pos++] = 1;
            else container[pos++] = (float)(s[i + 2] - '0');
        }
        else if (i == 0 && isdigit(s[i])) {
            for (int j = i; j < len; j++) {
                if (s[j] == 'x') {
                    strncpy_s(found, subStr(s, i, j), 100);
                    container[pos++] = atof(found);
                    if (s[j + 1] != '^') {
                        container[pos++] = 1;
                    }
                    else {
                        container[pos++] = (float)(s[j + 2] - '0');
                    }
                    break;
                }
                else if (s[j] == '+' || s[j] == '-' || j == len - 1) {
                    if (j == len - 1) {
                        strncpy_s(found, subStr(s, i, len), 100);
                    }
                    else {
                        strncpy_s(found, subStr(s, i, j), 100);
                    }
                    container[pos++] = atof(found);
                    container[pos++] = 0;
                    break;
                }
            }
        }
        else if (s[i] == '+' || s[i] == '-') {
            if (s[i + 1] == 'x' && s[i] == '+') {
                container[pos++] = 1;
                if (s[i + 2] != '^') container[pos++] = 1;
                else container[pos++] = (float)(s[i + 3] - '0');
            }
            else if (s[i + 1] == 'x' && s[i] == '-') {
                container[pos++] = -1;
                if (s[i + 2] != '^') container[pos++] = 1;
                else container[pos++] = (float)(s[i + 3] - '0');
            }
            else {
                for (int j = i + 1; j < len; j++) {
                    if (s[j] == 'x') {
                        strncpy_s(found, subStr(s, i, j), 100);
                        container[pos++] = atof(found);
                        if (s[j + 1] != '^') {
                            container[pos++] = 1;
                        }
                        else {
                            container[pos++] = (float)(s[j + 2] - '0');
                        }
                        break;
                    }
                    else if (s[j] == '+' || s[j] == '-' || j == len - 1) {
                        if (j == len - 1) {
                            strncpy_s(found, subStr(s, i, len), 100);
                        }
                        else {
                            strncpy_s(found, subStr(s, i, j), 100);
                        }
                        container[pos++] = atof(found);
                        container[pos++] = 0;
                        break;
                    }
                }
            }
        }
    }
    n = pos;
}

Проблема:

char s1[] = "3+2x";
char *s2 = subStr(s1, 0, strlen(s1)));
printf("|%s|\n", s1);
printf("|%s|\n", s2);

Выходные данные одинаковы: | 3 + 2x |и strcmp равен 0, но когда я передаю их в функцию getCoefnExpo (char s []):

getCoefnExpo(s1); //output 3,0,2,1
getCoefnExpo(s2); //output 3,0

Я не думаю, что с getCoefnExp () что-то не так, если я не использую subStr(), subStr () не может ошибаться, так как они выдают буквально одинаковые результаты.Я понятия не имею, что здесь происходит, пожалуйста, дайте мне знать.Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Здесь разные проблемы.

Во-первых, все просто: char s2[] = subStr(s1, 0, strlen(s1))); - это просто неверный C, и CLang его душит. Поэтому я буду считать, что вам нужно только:

char *s2 = subStr(s1, 0, strlen(s1)));

Массивы могут распадаться на указатели, а массивы и указатели имеют одинаковый синтаксис, но они по-прежнему разные животные.

Другая проблема (которая, вероятно, является причиной ваших ошибок) - subStr возвращает статический массив. Интересный побочный эффект:

char *s1 = subStr("abcd", 0, 2);
char *s2 = subStr("ijkl", 0, 2);

printf("%s-%s\n", s1, s2);   // displays "ij-ij"!

Поскольку s1 является просто указателем, статический массив из subStr и массив был перезаписан вторым вызовом ...

Так что, если вы используете его внутри getCoefnExpo, вы не должны передавать массив, созданный из него.

Что следует помнить: статический - это возможный способ вернуть массив из функции, но результатом является просто указатель, и указанная память будет удалена при следующем вызове. Будьте бдительны ...

0 голосов
/ 14 мая 2019

У вас есть множество вызовов substr внутри функции getCoefnExpo, которая перезаписывает предыдущее значение статической переменной sub.

Изменение определения функции substr

char * subStr(char s[], int start, int stop) {
    int c = 0;
    char sub[100];
    while (start + c < stop) {
        sub[c] = s[start + c];
        c++;
    }
    sub[c] = '\0';
    char *tempRet = strdup(sub);
    return tempRet;
}

Также вам необходимо освободить память, выделенную на последующих этапах.

Или

Попросить вызывающего абонента дать буфер

char * subStr(char s[], int start, int stop, char *Result)
{
    int c = 0;
    while (start + c < stop) {
        Result[c] = s[start + c];
        c++;
    }
    return Result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...