C函数中未声明的标识符

当我编译以下C函数/程序时,我得到的错误如"missing ';' before 'type' 'remainder' : undeclared identifier" "missing ';' before 'type' 'remainder' : undeclared identifier" – 这个函数有什么问题?

 #include  void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } int main() { conversionTo(int number,int base); return 0; } 

我不是C专家,但从很久以前的经验来看,我相信你不能在函数中间声明变量。

此外,还不清楚您正在尝试使用函数/打印语句。

试试这个:

 #include  void conversionTo(int number,int base) { int remainder=number%base; if(number==0) return; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+ remainder); // Through the way ASCII works that gives the ASCII rep // of the remainder. else printf("%c",'a'-10+remainder); // Hex digits (AF). } int main() { conversionTo(/*Any number here*/10, /*any base number here*/2); return 0; } 

您需要定义变量,然后才能使用它们。 所以这:

 int main() { conversionTo(int number,int base); return 0; } 

应该成为这样的:

 int main(void) { int number; int base: number = 47; base = 11; conversionTo(number, base); return 0; } 

非C99兼容编译器也不喜欢在上下文中间声明变量:

 void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; /* this would fail. */ conversionTo((number/base),base); 

为了解决这个问题,打开另一个环境

 void conversionTo(int number,int base) { if(number==0) return; { int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } } 

您必须使用值或变量调用函数,而不是声明:

 conversionTo(123, 10); // using constant value 

要么

 int number = 123, base = 10; // variable declaration conversionTo(number, base); // using variable 

你正在调用你的函数错误 – 以这种方式传递参数:

 conversionTo(2,2); // assuming you want to convert 2 to binary 

要么

 int number = 123, base = 10; conversionTo(number, base); // note this is not the same number and base as in the definition of your conversionTo function 

完整代码:

 #include  void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } int main() { conversionTo(2,2); // assuming you want to convert 2 to binary return 0; } 

使用函数时有3件事:

函数声明/原型 - 函数的原型是:

 void conversionTo(int ,int ); 

function定义:

 void conversionTo(int number,int base /* Parameter list*/) { // your functionality } 

将函数传递给函数的函数调用:

 conversionTo(2,2); 

语句conversionTo(int number,int base); 只需重新声明它。 尝试这个,即使这将编译:

 int main() { printf("Hello World"); int main(); } 
 conversionTo(int number, int base) 

是声明函数可以采用哪些参数的语法。 要实际调用该函数,您需要省略该类型(假设您有相应名称的变量)

 int number = 5; int base = 10; conversionTo(number, base); // <-- no int here! 

或者您可以直接使用数字:

 conversionTo(5, 10); 

函数声明中的函数定义numberbase void conversionTo(int number, int base)是传递给它的值在函数内部的名称。 因此,如果您调用conversionTo(2,5) ,则会在函数内部看到2作为number ,而5将被视为base

如果你想使用变量而不是内容来调用函数,你可以这样做:

 int main() { int base = 2; int number = 5; conversionTo(base, number); return 0; } 

在这个令人困惑的例子中,变量basevalue具有值2和5。 但是当你将它们传递给函数时,它内部的值将是number = 2和base = 5.这表明这些变量实际上是不同的,尽管它们具有相同的名称。

您应该使用$ CC -std = c99进行编译,以便在块中间声明变量。

(参见规范中的6.8节)

声明“int remainder”必须在块中的任何语句之前。 声明可能有一个初始化器,就像你在这里一样。

你可以这样做:

  void conversionTo(int number,int base) { if (number > 0) { int remainder... } } 

因为该function不适用于负数。

修复例程中的其他错误:

  void conversionTo(int number,int base) { if(number>=0&&base>0&&base<=36) { int remainder=number%base; number/=base; if(number>0)conversionTo(number,base); printf("%c",(remainder<10)?'0'+remainder:'a'+remainder-10); } } 

如果数字为零,则将打印0,并且仅在需要时递归。