c语言 - fgets 上的循环退出条件不起作用



我有一个这样的文本文件

"input"
height : 227
width : 227
depth : 3
"conv"
num_output : 96
pad : 0
kernel_size : 11
stride : 4
group : 1
"relu"
"pool"
kernel_size : 3
stride : 2

我正在循环阅读它(这是部分代码(

char line[100];
while ((fgets(line, sizeof(line), filePtr))) {
if (line[0] != "n") {
sscanf(line, "%15s : %15s", tmpstr1, tmpstr2);
printf("%sn",  tmpstr2);
printf("line = %s", line);
} else
break;
}

但我观察到if条件总是成立,输出如下

"input"
227
line = height : 227
227
line = width : 227
3
line = depth : 3
3
line = 
3
line = "conv"
96
line = num_output : 96
0
line = pad : 0
11
line = kernel_size : 11
4
line = stride : 4
1
line = group : 1
1
line = 
1
line = "relu"
1
line = 
1
line = "pool"
3
line = kernel_size : 3
2
line = stride : 2

我也尝试过与进行比较,但结果没有改变。请指出我哪里出错了。

PS:我正在使用带有gcc 16.04 64.2.1的Ubuntu 5.2.1位机器。

换行符是一个字符,而不是一个字符串,所以改变这个:

line[0] != "n"

对此:

line[0] != 'n'

启用编译器警告(GCC 中的-Wall标志(,您应该看到如下所示的内容:

warning: comparison between pointer and integer
warning: comparison with string literal results in unspecified behavior [-Waddress]

您正在尝试将字符串文字与char进行比较。

跟:

if(line[0] != 'n')

效果很好。

如果您正在读取以文本模式(包括stdin(打开的文件,则基础系统用于标记行尾的任何表示形式都将转换为单个""字符。

应打开编译器警告。对于gcc来说,这是-pedantic-Werror.

在这个网站上,我们可以看到 fgets 不会改变 str 的值(在你的例子中是行(。由于该值不会更改,因此您的 if 测试会一直被评估为 true。

如果要检查 fgets 是否找到文件的末尾,则必须检查 fgets 是否返回 NULL。

您正在将字符与字符串进行比较:line[0] != "n"应该产生警告。 要检测空行,请改用以下命令:

line[0] != 'n'

请注意,您还应该验证sscanf()的返回值:

char line[100];
while (fgets(line, sizeof(line), filePtr) && *line != 'n') {
if (sscanf(line, "%15s : %15s", tmpstr1, tmpstr2) == 2) {
printf("%sn",  tmpstr2);
printf("line = %s", line);
} else {
printf("invalid format: %s", line);
}
}

最新更新