编译器显示警告,即使代码正在运行
Compiler showing warnings even though code is working
我一直在解决这个问题:
编写一个程序,交替合并两个文件中的行并将结果写入新文件。如果一个文件的行数少于另一个,则应将较大文件中的剩余行简单地复制到目标文件中。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
FILE *fp1;
FILE *fp2;
fp=fopen("sample3.txt","r");
fp1=fopen("sample4.txt","r");
fp2=fopen ("output.txt","w");
char a[100];
char b[100];
int *p;
int *c;
while (1){
if (p=fgets(a,100,fp)!=NULL){
fputs (a,fp2);
}
if (c=fgets(b,100,fp1)!=NULL){
fputs (b,fp2);
}
if (c==NULL && p==NULL){
break;
}
}
return 0;
}
虽然 output.txt 文件包含来自两个文件的字符串,但编译器显示
[警告] 在以下两行中,赋值从没有转换的整数指针:
if (c=fgets(b,100,fp1)!=NULL)
和
if (p=fgets(a,100,fp)!=NULL)
有人可以帮忙吗?
表达式:
c = fgets(b, 100, fp1) != NULL
相当于:
c = (fgets(b, 100, fp1) != NULL)
因为 !=
的优先级高于 =
,所以这会将比较中的布尔整数转换为指针。你应该使用明确的括号来解决这个问题:
(c = fgets(b, 100, fp1)) != NULL
这将对 c
进行赋值(因为括号赋予该操作更高的优先级)然后 将该值与 NULL
进行比较。
没有任何括号,你正在这样做:
if (c= (fgets(b,100,fp1)!=NULL) )
比较的结果是 int
,这就是您分配给 char* c
的结果。您可以打印它,您会看到它是 1
(当 fgets()
returns 不是 NULL
时)或 0
(如果 fgets()
returns NULL
).
你想要的是:
if ( (c=fgets(b,100,fp1)!=NULL) )
甚至更好(直到您更精通组合多个语句)
c= fgets(b,100,fp1);
if ( c!=NULL )
第二行也必须这样做。此外,将 p
和 c
从 int*
更改为 char*
。
两期:
p
和 c
是指向错误类型的指针(int
而不是 char
)
- 如果陈述错误。它用逻辑表达式的结果赋值指针。逻辑表达式的结果可以是整数
1
或 0
,因此会发出警告。需要先赋值指针,再比较。
char *p;
char *c;
while (1){
if ((p=fgets(a,100,fp))!=NULL){
fputs (a,fp2);
}
if ((c=fgets(b,100,fp1))!=NULL){
以下建议代码:
- 干净地编译
- 允许超过 99 个字符的行
- 检查所有 I/O 错误
- 在
stderr
上报告 I/O 个错误
- 执行所需的功能
- 给出 'magic' 个数字,比如 100,有意义的名字
- 可以很容易地 'tweaked' 所以一旦遇到 EOF,就不会再读取该文件
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LEN 100
int main( void )
{
FILE *fp = fopen( "sample3.txt", "r" );
if( ! fp )
{
perror( "fopen to read: sample3.txt failed" );
exit( EXIT_FAILURE );
}
FILE *fp1 = fopen( "sample4.txt", "r" );
if( ! fp1 )
{
perror( "fopen to read: sample4.txt failed" );
fclose( fp );
exit( EXIT_FAILURE );
}
FILE *fp2 = fopen ( "output.txt", "w" );
if( ! fp2 )
{
perror( "fopen to write: output.txt failed" );
fclose( fp );
fclose( fp1 );
exit( EXIT_FAILURE );
}
char buffer[ MAX_LINE_LEN ];
char *ap = NULL;
char *bp = NULL;
do
{
do
{
if ( (ap = fgets(buffer, sizeof( buffer ),fp) ) != NULL )
{ // then read successful
if( EOF == fputs ( buffer, fp2 ) )
{ // then, write failed
perror( "fputs failed" );
break;
}
}
else
{ // else, read failed
perror( "fgets failed" );
break;
}
// while end of line not found
} while( strchr( buffer, '\n' ) == NULL );
do
{
if ( (bp = fgets(buffer, sizeof( buffer ),fp1) ) != NULL )
{
if( EOF == fputs ( buffer, fp2 ) )
{
perror( "fputs failed" );
break;
}
}
else
{
perror( "fgets failed" );
break;
} while( strchr( buffer, '\n' ) == NULL );
// while more to read
} while( ap || bp );
fclose( fp );
fclose( fp1 );
fclose( fp2 );
return 0;
}
我一直在解决这个问题:
编写一个程序,交替合并两个文件中的行并将结果写入新文件。如果一个文件的行数少于另一个,则应将较大文件中的剩余行简单地复制到目标文件中。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
FILE *fp1;
FILE *fp2;
fp=fopen("sample3.txt","r");
fp1=fopen("sample4.txt","r");
fp2=fopen ("output.txt","w");
char a[100];
char b[100];
int *p;
int *c;
while (1){
if (p=fgets(a,100,fp)!=NULL){
fputs (a,fp2);
}
if (c=fgets(b,100,fp1)!=NULL){
fputs (b,fp2);
}
if (c==NULL && p==NULL){
break;
}
}
return 0;
}
虽然 output.txt 文件包含来自两个文件的字符串,但编译器显示 [警告] 在以下两行中,赋值从没有转换的整数指针:
if (c=fgets(b,100,fp1)!=NULL)
和
if (p=fgets(a,100,fp)!=NULL)
有人可以帮忙吗?
表达式:
c = fgets(b, 100, fp1) != NULL
相当于:
c = (fgets(b, 100, fp1) != NULL)
因为 !=
的优先级高于 =
,所以这会将比较中的布尔整数转换为指针。你应该使用明确的括号来解决这个问题:
(c = fgets(b, 100, fp1)) != NULL
这将对 c
进行赋值(因为括号赋予该操作更高的优先级)然后 将该值与 NULL
进行比较。
没有任何括号,你正在这样做:
if (c= (fgets(b,100,fp1)!=NULL) )
比较的结果是 int
,这就是您分配给 char* c
的结果。您可以打印它,您会看到它是 1
(当 fgets()
returns 不是 NULL
时)或 0
(如果 fgets()
returns NULL
).
你想要的是:
if ( (c=fgets(b,100,fp1)!=NULL) )
甚至更好(直到您更精通组合多个语句)
c= fgets(b,100,fp1);
if ( c!=NULL )
第二行也必须这样做。此外,将 p
和 c
从 int*
更改为 char*
。
两期:
p
和c
是指向错误类型的指针(int
而不是char
)- 如果陈述错误。它用逻辑表达式的结果赋值指针。逻辑表达式的结果可以是整数
1
或0
,因此会发出警告。需要先赋值指针,再比较。
char *p;
char *c;
while (1){
if ((p=fgets(a,100,fp))!=NULL){
fputs (a,fp2);
}
if ((c=fgets(b,100,fp1))!=NULL){
以下建议代码:
- 干净地编译
- 允许超过 99 个字符的行
- 检查所有 I/O 错误
- 在
stderr
上报告 I/O 个错误
- 执行所需的功能
- 给出 'magic' 个数字,比如 100,有意义的名字
- 可以很容易地 'tweaked' 所以一旦遇到 EOF,就不会再读取该文件
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LEN 100
int main( void )
{
FILE *fp = fopen( "sample3.txt", "r" );
if( ! fp )
{
perror( "fopen to read: sample3.txt failed" );
exit( EXIT_FAILURE );
}
FILE *fp1 = fopen( "sample4.txt", "r" );
if( ! fp1 )
{
perror( "fopen to read: sample4.txt failed" );
fclose( fp );
exit( EXIT_FAILURE );
}
FILE *fp2 = fopen ( "output.txt", "w" );
if( ! fp2 )
{
perror( "fopen to write: output.txt failed" );
fclose( fp );
fclose( fp1 );
exit( EXIT_FAILURE );
}
char buffer[ MAX_LINE_LEN ];
char *ap = NULL;
char *bp = NULL;
do
{
do
{
if ( (ap = fgets(buffer, sizeof( buffer ),fp) ) != NULL )
{ // then read successful
if( EOF == fputs ( buffer, fp2 ) )
{ // then, write failed
perror( "fputs failed" );
break;
}
}
else
{ // else, read failed
perror( "fgets failed" );
break;
}
// while end of line not found
} while( strchr( buffer, '\n' ) == NULL );
do
{
if ( (bp = fgets(buffer, sizeof( buffer ),fp1) ) != NULL )
{
if( EOF == fputs ( buffer, fp2 ) )
{
perror( "fputs failed" );
break;
}
}
else
{
perror( "fgets failed" );
break;
} while( strchr( buffer, '\n' ) == NULL );
// while more to read
} while( ap || bp );
fclose( fp );
fclose( fp1 );
fclose( fp2 );
return 0;
}