0

私はCプログラムを書きました。コンパイルされ、Windows 7のDevCで正常に動作します。ただし、Linux mintでコンパイルすると(「gccmain.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 の古いバージョンではエラーになりますが、以前は許可されていましたintstrchrただし、 を返しますchar*

そして、あなたのprintf呼び出しでは、間違った形式を使用しています%i.

gcc はここで完全に正しいです。

これらは警告であり、(残念ながら)エラーではないことに注意してください。

于 2012-09-29T13:59:18.573 に答える
3

Those aren't errors, they're warnings. Your code should have still compiled.

The first warnings is because you're passing &command to scanf, which is of type char (*)[100], and the specifier %s expects an argument of type char *. All you simply need to do is pass command to scanf (without the &), since a char array will decay into a char* when passed to a function.

You'll probably find that the code still works, with command and &command both referring to the same address (printf("%p %p", command, &command);).


The second warning is due to you forgetting to include <string.h>, which declares strchr. Since the compiler can't find the declaration, it implicitly generates one, which doesn't turn out to match the real one.


Lastly, strchr returns a char*, and the specifier %i is intended to be used for ints. If you want to print out an address using printf, use the %p specifier.


You should also probably avoid system("PAUSE"); (which won't work on Linux), and replace it with a function that waits for user input.

于 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");

use: printf("Press 'Enter' to continue: ..."); while ( getchar() != '\n') {
i=1; } getchar(); 0 を返します。

于 2012-09-29T14:05:09.453 に答える