我之前从未见过:
上方的左下角是什么?该计划的最新版本是
#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:~$
答案 0 :(得分:3)
这很可能是因为没有将有效的const char *传递给void perror(const char *s),这使得<filename>: No such file or directory
中的文件名输出为垃圾/不可打印的字符。
perror()函数应将通过符号errno访问的错误号映射到依赖于语言的错误消息,该错误消息应写入标准错误流,如下所示:
首先(如果s不是空指针且s指向的字符不是空字节),则s指向的字符串后跟冒号和。
然后是一个错误消息字符串,后跟一个。
答案 1 :(得分:2)
我认为您更正了警告driveinfo.c:17或发布您的代码。 好吧;)
祝你好运!答案 2 :(得分:1)
“varning att skicka heltal utan konvertering ...”听起来像是对perror
的调用,可能是一些不是字符串的东西?
如果您发布代码,我们可能会更清楚地看到,但我很确定警告和输出是相关的。
编辑:如果您将filename[25]
传递给该函数,我会发出此警告。如果你传递&filename[25]
,那么你可能会传递一些根本不是字符串的东西,所以会打印一些随机字节,几乎可以打印任何字符。