0

私は前にそれを見たことがない:

ここに画像の説明を入力

上の左下隅は何ですか? プログラムの最新バージョンは、

#include <stdio.h>
#include <stdlib.h> 
int main(int argc, char **argv)
{
   int ch;
   char file_name[25] = "/proc/scsi/scsi";
   FILE *fp; 
   fp = fopen(file_name,"r"); // read mode 
   if (fp == NULL)
   {
      perror(file_name);
      exit(EXIT_FAILURE);
   } 
   printf("The contents of %s file are :\n", file_name); 
   while ((ch = fgetc(fp)) != EOF)
      putchar(ch); 
   fclose(fp);
   return 0;
}

テスト

$ cc driveinfo.c;./a.out 
The contents of /proc/scsi/scsi file are :
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: WDC WD2500JS-75N Rev: 10.0
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: ST3250824AS      Rev: 3.AD
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: TSSTcorp Model: DVD+-RW TS-H653A Rev: D300
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi3 Channel: 00 Id: 00 Lun: 00
  Vendor: Optiarc  Model: DVD-ROM DDU1681S Rev: 102A
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
  Vendor: Lexar    Model: USB Flash Drive  Rev: 1100
  Type:   Direct-Access                    ANSI  SCSI revision: 00
Host: scsi5 Channel: 00 Id: 00 Lun: 00
  Vendor: WD       Model: 5000AAKB Externa Rev: l108
  Type:   Direct-Access                    ANSI  SCSI revision: 00

以下は、奇妙な出力を再現します。

#include <stdio.h>
#include <stdlib.h> 
int main(int argc, char **argv)
{
   int ch;
   char file_name[25] = "/proc/scsi/scsi-notExist";
   FILE *fp; 
   fp = fopen(file_name,"r"); // read mode 
   if (fp == NULL)
   {
      perror(&file_name[25]);
      exit(EXIT_FAILURE);
   } 
   printf("The contents of %s file are :\n", file_name); 
   while ((ch = fgetc(fp)) != EOF)
      putchar(ch); 
   fclose(fp);
   return 0;
}

アップデート

clang コンパイラは警告しますが、(g)cc は警告しません:

$ clang -Wconversion cpu-disk-info.c
cpu-disk-info.c:14:15: warning: array index of '25' indexes past the end of an
      array (that contains 16 elements) [-Warray-bounds]
      perror(&file_name[25]);
              ^         ~~
cpu-disk-info.c:6:4: note: array 'file_name' declared here
   char file_name[] = "/proc/scsi/scsi";
   ^
1 warning generated.
dev@dev-OptiPlex-745:~$ gcc -Wconversion cpu-disk-info.c
dev@dev-OptiPlex-745:~$ 
4

3 に答える 3

3

これは、有効な const char* をvoid perror(const char *s)に渡していないことが原因である可能性が最も高く、ファイル名が<filename>: No such file or directoryガベージ/印刷不可能な文字として出力されます。

perror() 関数は、シンボル errno を介してアクセスされるエラー番号を言語依存のエラー メッセージにマップし、次のように標準エラー ストリームに書き込みます。

最初に (s がヌル ポインターではなく、s が指す文字がヌル バイトでない場合)、s が指す文字列の後にコロンと .

次に、エラー メッセージ文字列の後に .

于 2013-03-06T20:03:20.643 に答える
2

警告 driveinfo.c:17 を修正するか、コードを投稿すると思います。そしてそれはOKです;)

幸運を !

于 2013-03-06T20:07:33.183 に答える
1

「varning att skicka heltal utan konvertering ...」perrorは、文字列ではない何かを呼び出しているように聞こえますか?

コードを投稿すると、おそらくより明確にわかるようになりますが、警告と出力が関連していることは確かです。

編集:filename[25]関数に渡す場合、この警告が必要です。を渡す場合&filename[25]は、おそらく文字列ではないものを渡しているため、ランダムなバイトが出力され、ほとんど何でも出力される可能性があります。

于 2013-03-06T20:13:23.520 に答える