C 获取编译错误
下面是给我的任务: 编写一个函数C 获取编译错误,c,compiler-errors,C,Compiler Errors,下面是给我的任务: 编写一个函数fact\u calc,该函数接受一个字符串输出参数和一个整数输入参数n,并返回一个显示n计算结果的字符串。例如,如果为n提供的值为6,则返回的字符串为 “6!x 6 x 5 x 4 x 3 x 2 x 1 x=720”。编写一个程序,反复提示用户输入0到9之间的整数,调用fact\u calc,并将结果字符串输出到一个大小合适的星号框中,以包围结果。如果用户输入无效值,程序应显示错误消息并重新输入有效值。sentinel-1的输入应该导致输入循环退出 这是我的密
fact\u calc
,该函数接受一个字符串输出参数和一个整数输入参数n
,并返回一个显示n计算结果的字符串代码>。例如,如果为n
提供的值为6,则返回的字符串为
“6!x 6 x 5 x 4 x 3 x 2 x 1 x=720”
。编写一个程序,反复提示用户输入0到9之间的整数,调用fact\u calc
,并将结果字符串输出到一个大小合适的星号框中,以包围结果。如果用户输入无效值,程序应显示错误消息并重新输入有效值。sentinel-1的输入应该导致输入循环退出
这是我的密码:
#include <stdio.h>
/*Prototypes*/
void fact_calc(char [], int);
int main(void)
{
char calc[99];
int num1;
do{
printf("Enter an integer between 0 and 9 or -1 to quit: ");
scanf("%d", &num1);
fact_calc(calc, num1);
}while( num1 != -1 );
return (0);
} //end main
/*Place function definitions below*/
void fact_calc(char calc[], int num1)
{
if(num1 == 0)
char calc[] = "0! = 0 = 0";
else if(num1 == 1)
char calc[] = "1! = 1 = 0"
else if(num1 == 2)
char calc[99] = "2! = 2 x 1 = 2"
else if(num1 == 3)
char calc[99] = "3! = 3 x 2 x 1 = 6"
else if(num1 == 4)
char calc[99] = "4! = 4 x 3 x 2 x 1 = 24"
else if(num1 == 5)
char calc[99] = "5! = 5 x 4 x 3 x 2 x 1 = 120"
else if(num1 == 6)
char calc[99] = "6! = 6 x 5 x 4 x 3 x 2 x 1 = 720"
else if(num1 == 7)
char calc[99] = "7! = 7 x 6 x 5 x 4 x 3 x 2 x 1 = 5040"
else if(num1 == 8)
char calc[99] = "8! = 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40320"
else if(num1 == 9)
char calc[99] = "9! = 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 362880"
else
printf("Invalid Entry");
}
我仍然必须打印出字符串,但我无法理解错误的含义或我做错了什么。提前感谢您的帮助
char calc[] = "1! = 1 = 0"
你不认为你应该用一个来结束这一行吗代码>
char calc[] = "1! = 1 = 0";
需要对其余的行执行类似的修复您不能在C中分配字符串(字符数组)。您应该使用strcpy()
例如
请注意,只有100%确定calc
足够大,可以存储整个字符串时,才应使用strcpy()。如果没有,请改用strncpy()
。例如:
strncpy(calc, "2! = 2 x 1 = 2", 99);
calc[98] = '\0';
// a better way would be to pass 99 to your function, or to declare a macro
最后,请注意,两者都是0!和1!应该是1,而不是0。您的程序正在执行一些奇怪的操作。我怀疑它能达到你的期望
您正在if
语句体中声明变量。这些变量只在主体的范围内,您不需要对它们做任何操作
您的程序可以正常运行。我建议简单地让fact\u calc()
返回文本字符串,而不是尝试分配给变量
/*Place function definitions below*/
char const *fact_calc(char calc[], int num1)
{
if(num1 == 0)
return "0! = 0 = 0";
else if(num1 == 1)
return "1! = 1 = 0";
else if(num1 == 2)
return "2! = 2 x 1 = 2";
else if(num1 == 3)
return "3! = 3 x 2 x 1 = 6";
else if(num1 == 4)
return "4! = 4 x 3 x 2 x 1 = 24";
else if(num1 == 5)
return "5! = 5 x 4 x 3 x 2 x 1 = 120";
else if(num1 == 6)
return "6! = 6 x 5 x 4 x 3 x 2 x 1 = 720";
else if(num1 == 7)
return "7! = 7 x 6 x 5 x 4 x 3 x 2 x 1 = 5040";
else if(num1 == 8)
return "8! = 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40320";
else if(num1 == 9)
return "9! = 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 362880";
/* Invalid Entry */
return NULL;
}
然后,主函数应该声明一个类型为char const*
的变量来存储此函数返回的指针,并且应该检查指针是否未设置为NULL
(如果指针设置为NULL
,则打印“无效条目”
).问题是,即使使用char calc[]=“1!=1=0”也没有任何意义代码>在他的程序中。@ouah先生,我真的没有调查他想做什么。刚才看到错误就是因为这个。是的,我明白你的意思,但这取决于他想做什么。应该注意的是,添加分号并不能修复代码。若你们不相信我的话,试着用分号来编译它。你们认为在初始化过程中分配字符串也是错误的吗?关键是OP的代码并不能说明问题sense@Gopi我说的是“你不能分配字符串”,而不是“你不能初始化字符串”。我向OP指出了如何修复他的代码。@ace firstsizeof calc
withcalc
函数的参数将产生指针的大小,而不是数组的大小,第二个strncpy
并不总是空终止其目标缓冲区,因此您必须手动执行。@ouah抱歉忘记了这一点;固定的
strncpy(calc, "2! = 2 x 1 = 2", 99);
calc[98] = '\0';
// a better way would be to pass 99 to your function, or to declare a macro
/*Place function definitions below*/
char const *fact_calc(char calc[], int num1)
{
if(num1 == 0)
return "0! = 0 = 0";
else if(num1 == 1)
return "1! = 1 = 0";
else if(num1 == 2)
return "2! = 2 x 1 = 2";
else if(num1 == 3)
return "3! = 3 x 2 x 1 = 6";
else if(num1 == 4)
return "4! = 4 x 3 x 2 x 1 = 24";
else if(num1 == 5)
return "5! = 5 x 4 x 3 x 2 x 1 = 120";
else if(num1 == 6)
return "6! = 6 x 5 x 4 x 3 x 2 x 1 = 720";
else if(num1 == 7)
return "7! = 7 x 6 x 5 x 4 x 3 x 2 x 1 = 5040";
else if(num1 == 8)
return "8! = 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40320";
else if(num1 == 9)
return "9! = 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 362880";
/* Invalid Entry */
return NULL;
}