语言是葡萄牙语,但我想你已经明白了。我的main只调用菜单函数(注释中的函数是可以工作的test )。
在菜单中,我引入了选项1,它调用相同的函数。但是有些地方不对劲。
如果我只在输入上测试它:
(1/1)x^2 //它读取多项式(2/1) //读取有理数并返回4
(你可以猜到它是做什么的,计算x的一个实例的值,而不是有理的)
我的多项式是具有系数(有理)和度(整数)的线性链表
int main ()
{
menu_interactivo ();
// instanciacao ();
return 0;
}
void menu_interactivo(void)
{
int i;
do{
printf("1. Instanciacao de um polinomio com um escalar\n");
printf("2. Multiplicacao de um polinomio por um escalar\n");
printf("3. Soma de dois polinomios\n");
printf("4. Multiplicacao de dois polinomios\n");
printf("5. Divisao de dois polinomios\n");
printf("0. Sair\n");
scanf ("%d", &i);
switch (i)
{
case 0: exit(0);
break;
case 1: instanciacao ();
break;
case 2: multiplicacao_esc ();
break;
case 3: somar_pol ();
break;
case 4: multiplicacao_pol ();
break;
case 5: divisao_pol ();
break;
default:printf("O numero introduzido nao e valido!\n");
}
}
while (i != 0);
}当我使用菜单调用它时,使用相同的输入,它不会停止阅读多义词(我之所以知道这一点,是因为它不像在另一个例子中那样要求我提供rational )。
我使用valgrind --track-origins=yes运行它,返回以下内容:
==17482== Memcheck, a memory error detector
==17482== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==17482== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==17482== Command: ./teste
==17482==
1. Instanciacao de um polinomio com um escalar
2. Multiplicacao de um polinomio por um escalar
3. Soma de dois polinomios
4. Multiplicacao de dois polinomios
5. Divisao de dois polinomios
0. Sair
1
Introduza um polinomio na forma (n0/d0)x^e0 + (n1/d1)x^e1 + ... + (nk/dk)^ek,
com ei > e(i+1):
(1/1)x^2
==17482== Conditional jump or move depends on uninitialised value(s)
==17482== at 0x401126: simplifica_f (fraccoes.c:53)
==17482== by 0x4010CB: le_f (fraccoes.c:30)
==17482== by 0x400CDA: le_pol (polinomios.c:156)
==17482== by 0x400817: instanciacao (t4.c:14)
==17482== by 0x40098C: menu_interactivo (t4.c:68)
==17482== by 0x4009BF: main (t4.c:86)
==17482== Uninitialised value was created by a stack allocation
==17482== at 0x401048: le_f (fraccoes.c:19)
==17482==
==17482== Conditional jump or move depends on uninitialised value(s)
==17482== at 0x400D03: le_pol (polinomios.c:163)
==17482== by 0x400817: instanciacao (t4.c:14)
==17482== by 0x40098C: menu_interactivo (t4.c:68)
==17482== by 0x4009BF: main (t4.c:86)
==17482== Uninitialised value was created by a stack allocation
==17482== at 0x401048: le_f (fraccoes.c:19)
==17482== 现在,我将向您提供名为
void le_pol (pol *p)
{
fraccao f;
int e;
char c;
printf ("Introduza um polinomio na forma (n0/d0)x^e0 + (n1/d1)x^e1 + ... + (nk/dk)^ek,\n");
printf("com ei > e(i+1):\n");
*p = NULL;
do
{
le_f (&f);
getchar();
getchar();
scanf ("%d", &e);
if (f.n != 0) //polinomios.c line 163
*p = add (*p, f, e);
c = getchar ();
if (c != '\n')
{
getchar();
getchar();
}
}
while (c != '\n');
}
void instanciacao (void)
{
pol p1;
fraccao f;
le_pol (&p1);
printf ("Insira uma fraccao na forma (n/d):\n");
le_f (&f);
escreve_f(inst_esc_pol(p1, f));
}
void le_f (fraccao *f)
{ //line fraccoes.c line 19
int n, d;
getchar ();
scanf ("%d", &n);
getchar ();
scanf ("%d", &d);
getchar ();
assert (d != 0);
*f = simplifica_f(cria_f(n, d));
}simplifica_f简化了rational,而cria_f创建了给定分子和分母的有理
有人能帮帮我吗?提前谢谢。
如果你想让我提供一些测试,就把它贴出来吧。
再见。
发布于 2010-12-30 01:22:07
只需插入一个
getchar()在从菜单中读取int之后,您就完成了^^
问题是由于您在菜单选项后输入的未读'\n‘导致的。使用该调用丢弃它,一切都会按计划进行。
发布于 2010-12-28 02:47:25
您可能需要引入一些错误检查-具体地说,您需要检查scanf()调用是否真正转换了一个值。我怀疑分散的getchar()调用消耗的太少或太多,并且您的一个或多个scanf()操作正在失败,留下n和/或d (在le_f()中)等变量未初始化,这将导致进一步的问题。
总是,但总是,假设I/O (特别是输入)会出错--在另一端(例如我或你)会有一个笨蛋键入与你的代码期望不同的数据。
至少出于调试目的,将getchar()调用替换为您自己的函数,该函数读取字符并回显读取的内容(并检测EOF并在出错时退出-直到您有了更复杂的错误处理方案):
#include <ctype.h>
#include <stdio.h>
static void readchar(void)
{
int c;
if ((c = getchar()) == EOF)
{
fprintf(stderr, "Unexpected EOF - exiting\n");
exit(1);
}
printf("Got: %d (0x%02X) %c\n", c, c, isprint(c) ? c : '?');
}类似地,您应该对scanf()调用执行类似的操作:
static void readint(int *var)
{
if (scanf("%d", var) != 1)
{
fprintf(stderr, "Failed to read integer - exiting\n");
exit(1);
}
printf("Got: %d\n", *var);
}用它代替你的scanf()调用。您可以通过将行的其余部分读入缓冲区并打印以下内容来改进readint()中的诊断:
static void readint(int *var)
{
if (scanf("%d", var) != 1)
{
char buffer[32];
fprintf(stderr, "Failed to read integer - exiting\n");
if (fgets(buffer, sizeof(buffer), stdin) != 0)
fprintf(stderr, "Residual data: <<%s>>\n", buffer);
exit(1);
}
printf("Got: %d\n", *var);
}您可能会从“残差数据”打印中得到两个换行符,但这总比没有要好(如果残差行的长度超过31个字符,就会发生这种情况。这些信息可能足以告诉你问题出在哪里--缺少更好的输入跟踪。
使用scanf()通常不是最好的方法-如果你用fgets()读取行,然后用sscanf()扫描输入,你可以更好地控制错误处理等。
https://stackoverflow.com/questions/4534885
复制相似问题