0

我写了一个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]
4

3 回答 3

3

在 Windows 7 上编译时不会显示这些错误。所以在 linux 上也一定没有错!

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

gcc 警告您有关您的错误/错误,在

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

你传递command你应该传递第一个字节的地址的地址command,或者command与自动数组到指针的转换一样,或者明确地作为&command[0].

strchr在未声明的情况下使用它,这是 C 的非古代版本中的一个错误,但以前允许使用,其中 use 隐式声明一个函数返回一个int. strchr但是,返回一个char*.

在您的printf通话中,您使用了错误的格式,%i.

gcc 在这里是完全正确的。

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

于 2012-09-29T13:59:18.573 回答
3

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

第一个警告是因为您正在传递&commandto scanf,它是 type char (*)[100],并且说明符%s需要一个 type 的参数char *。您只需要传递commandscanf(不带&),因为当传递给函数时,char数组将衰减为 a 。char*

您可能会发现代码仍然有效,command并且&command两者都引用相同的地址 ( printf("%p %p", command, &command);)。


第二个警告是由于您忘记包含<string.h>声明strchr。由于编译器找不到声明,它会隐式生成一个,结果与真实的不匹配。


最后,strchr返回 a char*,说明符%i旨在用于ints。如果要使用 打印地址printf,请使用说明%p符。


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

于 2012-09-29T14:01:29.837 回答
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("按 'Enter' 继续:..."); 而 ( getchar() != '\n') {
i=1; } getchar(); 返回0;

于 2012-09-29T14:05:09.453 回答