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 first
sizeof calc
with
calc
函数的参数将产生指针的大小,而不是数组的大小,第二个
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;
}