如何在linux mint上编译c程序时修复异常错误?

时间:2012-09-29 13:48:55

标签: c linux gcc cross-platform

我写了一个C程序。它在Windows 7上的DevC上编译并正常工作。 但是当我在Linux mint上编译它时(使用'gcc main.c'命令)它不会编译并给出错误。在Windows 7上编译时不会显示这些错误。因此在Linux上也没有任何错误!如何在Linux上通过gcc编译它?

C代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   char command[100];

   printf("Enter the command:");
   scanf("%[^\t\n]", &command);
   printf("%s\n", command);
   strchr(command, '&');

   printf("%i", strchr(command, '&'));

   system("PAUSE"); 

   return 0;
}

错误:

mint@mint ~ $ gcc ass1/main.c
ass1/main.c: In function 'main':
ass1/main.c:8:5: warning: format '%[^   
' expects argument of type 'char *', but argument 2 has type 'char (*)[100]' [-Wformat]
ass1/main.c:11:3: warning: incompatible implicit declaration of built-in function 'strchr' [enabled by default]
ass1/main.c:13:5: warning: format '%i' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat]

3 个答案:

答案 0 :(得分:3)

  

在Windows 7上编译时不会显示这些错误。因此在linux上也没有任何错误!

这是一个错误的结论。在这种情况下,Windows上的编译器远比gcc宽松。

gcc警告你错误/错误,

scanf("%[^\t\n]", &command);

您传递command的地址,您应该在command中传递第一个字节的地址,或者command使用自动数组到指针转换,或者显式为&command[0]

你使用strchr而没有声明它,这是非古代版本C中的一个错误,但之前允许使用,其中一个用户隐式声明一个函数返回int。但是,strchr会返回char*

printf来电中,您使用了错误的格式%i

gcc在这里完全正确。

请注意,这些是警告,并且(不幸的是)不是错误

答案 1 :(得分:3)

这些不是错误,而是警告。您的代码应该仍然已编译。

第一个警告是因为您将&command传递给scanf char (*)[100],类型为%s,而说明符char *需要{{1}类型的参数}}。您只需将command传递给scanf(不包含&),因为char数组在传递给char*时会衰减为command功能

您可能会发现代码仍然有效,&commandprintf("%p %p", command, &command);都指向同一地址(<string.h>)。


第二个警告是由于您忘记包含strchr,其声明strchr。由于编译器无法找到声明,因此它隐式生成一个声明,但结果与实际声明不匹配。


最后,char*返回%i,而说明符int旨在用于printf。如果您想使用%p打印地址,请使用system("PAUSE");说明符。


您还应该避免{{1}}(这在Linux上不起作用),并将其替换为等待用户输入的函数。

答案 2 :(得分:0)

整合以前的答案,将在Linux上编译的代码将起作用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // use this header to include strchr(command, '&');

int main(int argc, char *argv[])
{
   char command[100];

   printf("Enter the command:");
   scanf("%s", command);
   printf("%s\n", command);
   strchr(command, '&');

   printf("%p", strchr(command, '&')); 
   /* strchr(command, '&') returns a pointer so you need to tell printf you are printing one. */

   system("PAUSE"); 

   return 0;
}

输出:

oz@Linux:~$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:12:4: warning: statement with no effect [-Wunused-value]
oz@Linux:~$ ./a.out 
Enter the command:doSomething
doSomething
sh: 1: PAUSE: not found

而不是

  system("PAUSE");

使用:    printf(“按'输入'继续:......”);    while(getchar()!='\ n'){
      I = 1;    }    的getchar();    返回0;