2017-08-15 107 views
2

我有这样循环退出条件不起作用

"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("%s\n", 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 

我试图与比较以及结果不会改变。请指出我要出错的地方。

P.S. :我使用的是gcc 5.2.1的Ubuntu 16.04 64位机器。

+6

'行[0] = “\ n”' - > 'line [0]!='\ n'' – BLUEPIXY

+3

您正在比较'char'与字符串文字,您应该打开编译器警告。 'gcc' -pedantic -Error –

+1

@BLUEPIXY感谢您指出。完全忽略了那个错字。 –

回答

5

换行字符,而不是一个字符串,那么改变这一点:

line[0] != "\n" 

这样:

line[0] != '\n' 

启用编译器警告(-Wall标志GCC),你应该看到像这样:

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

您试图将字符串文字与char进行比较。

有了:

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

它运作良好。

如果您正在从文本模式下打开的文件(包括stdin)中读取数据,则底层系统用于标记行结束的任何表示都将被转换为单个'\ n'字符。

您应该打开编译器警告。对于gcc这是-pedantic-Werror

+0

好的答案,但请检查我的答案为标志(我只通过使用一个标志得到了警告)。 – gsamaras

+0

是的,你做的,虐待它,所以OP会看到有'gcc'更多的机会:-) –

+0

你更快,并有良好的答案,所以你应得的。 –

0

this site我们可以看到fgets不会改变str(在你的情况下是行)的值。因为这个值不会改变,所以你的if测试总是被评估为真。

如果你想检查fgets是否发现文件的结尾,你必须检查fgets是否返回NULL。

0

您正在比较字符与字符串: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("%s\n", tmpstr2); 
     printf("line = %s", line); 
    } else { 
     printf("invalid format: %s", line); 
    } 
}