继续接受三个数字的程序,并在三个数字中打印最大值。 我收到运行时错误(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;
}
任何帮助人员 感谢
答案 0 :(得分:1)
当您执行c[0] = malloc(10);
以及稍后执行某些句子时,您c[0] = strtok(...);
会覆盖c[0]
处的指针值,结果为strtok(3)
(它本身就是一个指针),而不是复制字符串内容。当您到for
free(3)
循环时,您将free()
函数传递给strtok
而不是malloc()
给出的值(这些是c
永远丢失,当您重新分配数组SIGABRT
值时),这是malloc
最可能的原因。
顺便说一句,您甚至不需要执行您在程序中执行的free
和strtok
中的任何操作。只需获得足够长的缓冲区来存储整行输入,然后使用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