编译器显示警告,即使代码正在运行

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 )

第二行也必须这样做。此外,将 pcint* 更改为 char*

两期:

  1. pc 是指向错误类型的指针(int 而不是 char
  2. 如果陈述错误。它用逻辑表达式的结果赋值指针。逻辑表达式的结果可以是整数 10 ,因此会发出警告。需要先赋值指针,再比较。
    char *p;
    char *c;
    while (1){
        if ((p=fgets(a,100,fp))!=NULL){
            fputs (a,fp2);
        }
        if ((c=fgets(b,100,fp1))!=NULL){

以下建议代码:

  1. 干净地编译
  2. 允许超过 99 个字符的行
  3. 检查所有 I/O 错误
  4. stderr
  5. 上报告 I/O 个错误
  6. 执行所需的功能
  7. 给出 'magic' 个数字,比如 100,有意义的名字
  8. 可以很容易地 '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;
}