C90:始终满足循环功能条件

6qftjkof  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(200)

第一个问题主程序在文件set_my中。c你必须写一个程序,接受一个整数值列表作为输入 类型int。从这个值列表中,您必须建立一个组。程序必须接收值列表 然后从用户中创建一个组,最后按成员到达的顺序打印该组的成员。可以假定输入的正态性,但可能存在值 在输入列表中重复不止一次对于这样的值(在输入中出现不止一次),它的第一次出现决定了它在打印输出中的位置。组中的成员数量不受限制,并且必须使用realloc函数。值的数量 在输入中也不受限制。输入可以在多行中,并且每行可以出现无限数量的条目。
输入的结束将由标准库中的函数返回的EOF值来标识,通过该函数执行输入(在键盘输入中,可以通过在新行的开头键入d-ctrl来插入EOF)。输入示例:

13 13 13 45 -9 -9 -9 18 18 18 3 4 55 45 66 13 66

对于此输入,输出将为:

13 45 -9 18 3 4 55 66

输出仅包含输入中出现的唯一值,按其首次出现的顺序排列。h
删除重复值。
你需要写两个函数:
set_get -此函数读取用户的输入并将其存储在一个集合中。
set_print -此函数以所需的顺序和格式打印集合中的元素。
下面是我的代码,我到目前为止做了什么。

setSize setArr;
char* input; /*problem with pointing char pointer type directly*/
int prev, size, inputN, count;
int* set;
bool checkMinus;
checkMinus= true;
prev = DEFULT;/*initialze to DEFULT */
set  = NULL; /* initialize set to NULL */
size = 0; /* size of set*/
count = 0;/* number of elements in set*/
inputN; /* transformed from char type to integar type*/
input = malloc(sizeof(char)*2);
input[1] = '\0';
set = (int *) malloc(sizeof(int));

/* prompt user for input */
printf("Enter integers to add to set, one at a time or space between each integers.\n");
printf("End input with Ctrl-D (EOF).\n");
/* loop to read input until EOF is reached */
while (1)
{
    *input = getchar();
    if (feof(stdin)) {
        break;
    }
    
    if (input == ' ' && !checkMinus) { /* initializing check back to true conditons*/
        checkMinus = true; 
    }
                    
    if (!checkMinus && input == '-'){/* check for correction of minus or pluses */
        printf("Please insert valid input requested "
               "(not allowed to have plus or twice in the same number minus).\n");
        exit(1);
    }
                
    if ((*input <'0' || *input > '9') && *input != ' ' && *input != '-'  && *input != '\n' && *input != EOF ) {
        printf("Please insert valid input requested( phrase plus sign was included ).\n");
        exit(1);
    }
                    
    inputN = atoi(input);/*transforming to integar*/

    if (inputN != prev) {
        prev = inputN;/* we will assign new value to prev */
        set = (int *) realloc(set,SIZE_ENLARGE(size++)); /*resize set*/

        if (set == NULL) { /*check if realloc failed*/
            printf("Error: could not allocate memory.\n");
            exit(1);
        }
                        
        set[count++] = inputN; /* add input to set */
    }
}

调试尝试添加两个更多的条件没有取得任何效果,但在调试过程中,我发现无论如何,条件总是满足的。我有一个完全不同的代码,但我不知道如何修复它,并开始一个新的从begginging,但现在我有一个奇怪的错误,其中一个条件

if  ((*input <'0' || *input > '9') && *input != ' ' && *input != '-'  && *input != '\n' && *input != EOF )

总是会遇到,我不知道如何修复它,它在while循环中,我真的不知道是什么原因导致了这个问题,也不知道如何修复它,请帮助我,我一直在努力解决这个问题。
我试过调试,发现我无法通过该条件(*input '0'||*input〉'9')&& *input!= ' ' && * 输入!= '-' && *input!= '\n' && *input!= EOF)

fykwrbwg

fykwrbwg1#

您发布了您的作业和一段有问题的代码:
1.你应该指出问题描述中的“无限”是有缺陷的。您受到虚拟内存或至少磁盘大小的限制。集合,根据定义,也是未排序的,所以他们应该叫它别的东西。
1.缺少头文件
1.甚至不在函数中代码片段

  1. setSize未定义
  2. DEFAULT未定义
  3. inputN;不执行任何操作;应该是初始化的
  4. input应该是一个int,当用来存储来自getchar()的数据。
    1.不知道为什么要动态分配input(),而它是一个大小为2的固定数组(实际上你只需要一个int)。
  5. input == ' '将一个指针与一个整数常量进行比较,这不是你想要的。
    1.将realloc()中的值赋给一个临时变量,否则会在失败时泄漏内存。在下面的代码中,调用者应该处理NULL返回值。
    1.不要投射void *
    1.在声明变量时,首选初始化变量。它减少了重复,消除了使用未初始化变量的错误情况。
    1.倾向于最小化变量的作用域
    1.使用更多的函数来构造代码。例如,如果你不能在这个任务中使用scanf(),你现在知道你只需要编写你自己的从stdin阅读整数的实现。此功能可能会失败。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

struct set {
    int *data;
    size_t n;
};

struct set *set_add(struct set *s, int v) {
    for(size_t i = 0; i < s->n; i++)
        if(s->data[i] == v)
            return s;
    int *tmp = realloc(s->data, sizeof(s->data) * (s->n + 1));
    if(!tmp)
        return NULL;
    s->data = tmp;
    s->data[s->n++] = v;
    return s;
}

void set_print(const struct set *s) {
    for(size_t i = 0; i < s->n; i++) {
        printf("%d%s", s->data[i], i + 1 == s->n ? "\n" : " ");
    }
}

struct set *set_get(struct set *s) {
    for(;;) {
        int v;
        if(scanf("%d", &v) != 1)
            break;
        set_add(s, v);
    }
    return s;
}

int main() {
    struct set *s = &(struct set) { 0 };
    set_get(s);
    set_print(s);
}

示例会话:

13 13 13 45 -9 -9 -9 18 18 18 3 4 55 45 66 13 66
13 45 -9 18 3 4 55 66

相关问题