保持接受三个数字的程序,并在三个数字中打印最大值

时间:2015-12-04 18:09:32

标签: c if-statement dynamic conditional

继续接受三个数字的程序,并在三个数字中打印最大值。 我收到运行时错误(SIGABRT) 这是我的代码

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

int main()
{
    char ch[30];
    char *c[3];
    long int i[3], mx_2;
    int o;
    while((fgets(ch,sizeof(ch),stdin))&&ch!='\0')
    {
        c[0] = (char *)malloc(10);
        c[1] = (char *)malloc(10);
        c[2] = (char *)malloc(10);
        c[0] = strtok(ch," ");
        c[1] = strtok(NULL," ");
        c[2] = strtok(NULL," ");
        i[0] = atoi(c[0]);
        i[1] = atoi(c[1]);
        i[2] = atoi(c[2]);
        mx_2 = i[0] > i[1] ? (i[0] >i[2] ? i[0] : i[2]) : (i[1] > i[2] ? i[1] : i[2]);
        printf("%ld\n",mx_2);
        fflush(stdin);
        for (o = 0; o < 3; o++) {
            free(c[o]);
        }
    }

    return 0;
}

任何帮助人员 感谢

2 个答案:

答案 0 :(得分:1)

当您执行c[0] = malloc(10);以及稍后执行某些句子时,您c[0] = strtok(...);会覆盖c[0]处的指针值,结果为strtok(3) (它本身就是一个指针),而不是复制字符串内容。当您到for free(3)循环时,您将free()函数传递给strtok而不是malloc()给出的值(这些是c永远丢失,当您重新分配数组SIGABRT值时),这是malloc最可能的原因。

顺便说一句,您甚至不需要执行您在程序中执行的freestrtok中的任何操作。只需获得足够长的缓冲区来存储整行输入,然后使用strtok获取所有块。另一方面,您必须测试NULL结果,就好像没有更多数据(您只输入两个值),它将返回#include <stdio.h> /* for input output routines like fgets */ #include <stdlib.h> /* for the constant EXIT_SUCCESS */ #include <limits.h> /* for INT_MAX and INT_MIN */ #include <string.h> /* for strtok */ int main() { char buffer[1024]; while (fgets(buffer, sizeof buffer, stdin)) { /* we have one full line of input up to sizeof buffer chars. */ int max = INT_MIN; int min = INT_MAX; char *s = strtok(buffer, " \t\n"); if (!s) { fprintf(stderr, "Invalid line\n"); continue; } while (s) { int x = atoi(s); if (x > max) max = x; if (x < min) min = x; s = strtok(NULL, " \t\n"); } if (max != INT_MIN) printf("MAX: %d\n", max); if (min != INT_MAX) printf("MIN: %d\n", min); } /* while */ return EXIT_SUCCESS; } /* main */

这段代码将完成工作,不仅适用于三个值,还适用于任何数字,直到数组大小:

arc = "MS"
title = "Multiple sclerosis (MS), also known as"
text = "Presenting signs and symptoms"

title.match(/\b#{Regexp.escape(acr)}\b/) # => #<MatchData "MS">
text.match(/\b#{Regexp.escape(acr)}\b/) # => nil

答案 1 :(得分:0)

更好地使用scanf完成任务:

 scanf(" %d %d %d", i, i+1, i+2);//note the leading space in the format