我写了一个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]
答案 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
功能
您可能会发现代码仍然有效,&command
和printf("%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;