Проблема с функцией и пока l oop в C: не удалось найти причину, по которой я не могу выйти из цикла - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть код, подобный приведенному ниже: (Работает хорошо)

#include <string.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(){
        char* func;            // divide the given polynomial expression with "()"
        func = malloc(sizeof(int));
        scanf("%[^\n]s", func);
        char *cal[20] = { NULL, };
        int i = 0;
        char *ptr = strtok(func, "()");
        while (ptr != NULL){
                cal[i] = ptr;
                printf("%s\n", cal[i]);
                i++;
                ptr = strtok(NULL, "()");
        }
        printf("Complete 1");
        return 0;
}

И я получил результат (Когда я ввожу (3x ** 2 + 4x ** 1 + 4) * (2x * * 2 + 3))

(3x**2+4x**1+4)
*
(2x**2+3)
Complete 1

Итак, я попытался сделать больше типов манипулирования с добавлением большего, в то время как l oop под кодом выше:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(){
        char* func;            // divide the given polynomial expression with "()"
        func = malloc(sizeof(int));
        scanf("%[^\n]s", func);
        char *cal[20] = { NULL, };
        int i = 0;
        char *ptr = strtok(func, "()");
        while (ptr != NULL){
                cal[i] = ptr;
                printf("%s\n", cal[i]);
                i++;
                ptr = strtok(NULL, "()");
        }
        printf("Complete 1");
        int j = 0;           // Change + to +- in the divided expression
        char *num[20] = {NULL, };
        char ptr2 = strtok(cal, "+");
        while (2j - 2 < i){
                for(int k = 0; k< strlen(cal[2j-2]); k++){
                        if ((cal[2j-2] + k) == '-'){
                                char s[] = "+";
                                memmove(cal[2j - 2] + k-1, s, strlen(s));
                        }
                }

        }
        printf("Complete 2");
        return 0;
}

Однако в этом В этом случае я получил результат, подобный

(3x**2+4x**1+4)
*
(2x**2+3)

, и функция еще не завершена.

Я думаю, что застрял в первом, пока l oop, потому что «Complete 1» не распечатывается .

Почему происходит такая ситуация?

Спасибо за чтение, и любая помощь будет принята с благодарностью.

PS Я запускал этот код в среде linux с g cc команда.

1 Ответ

1 голос
/ 26 апреля 2020

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

По-видимому, вы проигнорировали или отключили компилятор предупреждения, которые, кажется, root для проблемы. Вот ссылка для получения дополнительной информации:

Почему я должен всегда включать предупреждения компилятора?


Я не понимаю логику c позади вашего алгоритма, так Я не могу дать вам надежный ответ, так что это будет рассматриваться скорее как расширенный комментарий, чем как ответ просто ради дальнейшего продвижения.

Тем не менее, вот код, который, по крайней мере, исправляет все syntacti c выпусков. Я не могу объяснить их все подробно, потому что они слишком много. Сравните код с вашим, и вы увидите:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main(){
        char* func;            
        func = malloc(sizeof(*func) * 8);
        scanf("%[^\n]", func);
        char *cal[20] = { NULL };
        int i = 0;
        char *ptr = strtok(func, "()");
        while (ptr != NULL){
                cal[i] = ptr;
                printf("%s\n", cal[i]);
                i++;
                ptr = strtok(NULL, "()");
        }
        printf("Complete 1");
        int j = 0;           
        char *num[20] = { NULL };
        char* ptr2 = strtok(*cal, "+");
        char s[2] = "+";
        while (j - 2 < i){
                for(int k = 0; k < strlen(cal[j-2]); k++){
                        if ((*(cal[j-2] + k)) == '-'){

                             memmove(cal[j - 2] + (k-1), s, strlen(s));
                        }
                }
        }
        printf("Complete 2");
        return 0;
}

Нет гарантии, что это будет работать так, как вам нужно. Это должно дать вам только ключ в правильном направлении.

...