【问题标题】:error: expected expression before ‘char’错误:“char”之前的预期表达式
【发布时间】:2016-01-23 18:42:11
【问题描述】:

对不起,我在编译代码时遇到问题,我不知道如何解决它,因为我不知道它要求什么。

这出现在终端中:

" usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o:在函数_start': /build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:114: reference tomain'中没有定义 collect2:错误:ld 返回 1 个退出状态 "

我留下我的代码:

#include<stdio.h>
#include<string.h>
void calcular_vocal(char cadena[]){
   int l;
   char vocales[5]="a,e,i,o,u";
   int i, vector contadores[5];
   l=strlen(cadena);
   for(i=0;i<l;i++){
     if(cadena[i] =='a')
        cadena a++;
        vector contadores[0]++;
     if(cadena[i] =='e')
        cadena e++;
        vector contadores[1]++;;
     if(cadena[i] == 'i')
        cadena i++;
        vector contadores[2]++;
     if(cadena[i] =='o')
        cadena o++;
        vector contadores[3]++;
     if(cadena[i] =='u')
        cadena u++;
        vector contadores[4]++;
    for(i=0;i<5;i++){
      int max,pos;
      if(vector contadores[i]>max){
         max = vector contadores [i];
         pos = i;
      }
    }
     printf("The most repeated vocal is %c %d",vocales[pos],max);
   }
}
int main (void){
   char calcular_vocal(char[]);
}

【问题讨论】:

  • 不,这是问题XD
  • 但这实际上是您通过编译器运行的代码?因为看起来好像你得到了一个链接器错误,而编译器不应该真正编译你的代码: int i, vector contadores[5];是非法的。矢量是什么?你也不会在任何地方初始化你的整数,所以你一定会在那里得到垃圾值。 a、e、o 和 u 似乎也没有被声明。您已经声明了 i,但它的目的是作为您循环的计数器。
  • 代码中的vector 是什么?我能想象到的唯一方法是使用一些预处理器符号来表示任何东西或奇怪的东西......
  • 变量名不能包含空格。
  • 此代码只有在使用最奇怪的宏编写时才能编译,目的是让其他开发人员感到惊讶。你甚至不了解语言基础知识,例如如何使用数组、字符串或如何调用函数。通过阅读 Kernighan&Ritchie 或类似书籍开始学习 C。

标签: c function if-statement for-loop ansi


【解决方案1】:

更新

您似乎正在编译错误的文件。请参阅以下控制台命令和输出(它是德语,但我认为该消息与您的消息非常相似):

$ rm test1.c 
$ touch test1.c
$ gcc test1.c 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In Funktion `_start':
(.text+0x20): Nicht definierter Verweis auf `main'
collect2: error: ld returned 1 exit status
$ 

长话短说:您编译了错误的文件(可能是一个空文件),因此您会收到与您的任何代码完全无关的错误消息。


原答案

我将对您的代码进行一些假设,以便为您提供导致可编译代码的答案 - 运行程序的结果是否意味着任何事情取决于您(老实说,我故意建议不会为您提供最可能想要的程序的更改,因为您需要学习一些东西)。

我从你的主要功能开始

int main (void){
   char calcular_vocal(char[]);
}

您在主函数中所做的是编写calcular_vocal 函数的声明,但函数签名与您的实际实现不同。将其更改为 void calcular_vocal(char[]); 以使此部分可编译。

现在到 calcular_vocal 函数内的代码:

不允许使用char vocales[5]="a,e,i,o,u"; 行,因为字符串大小对于您的数组来说太大了。将数组大小增加到 9 或 10 以获得足够的可用空间:char vocales[9] = "a,e,i,o,u";

转到int i, vector contadores[5]; 行,假设您想要一个名为“vector contadores”的变量。您的变量名称中不能有空格,因此将其重命名为“vector_contadores”,以使所有出现的情况都能正常工作。

继续所有的 if 语句。它们都是一样的,所以我只写关于第一个的东西。代码cadena a++; 无效。你有多种选择来解决这个问题。 (1) 从该代码中删除a (cadena++;)。 (2) 为a 定义整数变量并从代码中删除cadena (a++;)。 (3) 改写为cadena['a']++;。还有更多选项可以使这部分可编译。

变量int max,pos;在for循环内部定义,但在外部使用。将它们的定义移到函数的顶部,您可以在其中定义其他变量。另外,用值-1 初始化max

这应该是编译这段代码所需的全部内容(除非我忘记了什么)

【讨论】:

  • for "a,e,i,o,u" ... 将数组大小增加到 9 或 10。它是什么,9 还是 10?你拥有它的方式(vocales[9] = "a,e,i,o,u")是错误的,因为 NULL 字符没有空间。一个安全的选择是建议:char vocales[]="a,e,i,o,u";。这可确保发生正确的初始化。 (这将是 10 个字节)。
  • @ryyker 好的,我可以将其重新表述为仅提及 9 号,因为这是所需的最小值。我还提到了 10,因为这是包括终止零在内的实际字符串大小。我没有提到,任何大于 9 的尺寸也是有效的(不仅仅是 10)。我不喜欢省略大小的想法,因为对我来说这意味着对大小敏感的用法,事实并非如此(我知道不是很理性)。在编辑之前我会考虑一下;)
  • ...尺寸 9,因为这是所需的最小值... 不,字符串; "a,e,i,o,u" 至少需要 10 个字节才能成为字符串。 C 字符串需要空终止符。这不是一种选择。在内存中,这个字符串看起来像:|a|,|e|,|i|,|o|,|u|\0|。并且需要 10 个字符。
  • @ryyker 你是唯一一个在这里谈论字符串的人......用例是一个数组初始化器,编译器完全允许使用字符串(它应该是一个字符数组)并且它允许初始化 char 数组成员以对应于字符串内容,而没有尾随零。所以你的建议是关于风格,而不是关于可编译性。我的回答肯定与风格无关。
  • 我不是唯一一个谈论字符串的人。你提出来了。根据您自己的回答:行 charvoces[5]="a,e,i,o,u";是不允许的,因为 string 的大小是……如果你不想使用这些信息,就忽略它。
猜你喜欢
  • 2014-11-30
  • 2021-06-06
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2014-02-22
  • 2023-04-11
  • 2014-04-20
  • 2015-03-28
相关资源
最近更新 更多