c - 为什么我的程序在执行 scanf() 之前突然终止



我正在尝试编写代码来替换文本文件中的一行。它编译成功,但一旦尝试扫描要替换的行号,它就会突然终止。

真的不知道我做错了什么。我也尝试过使用 fgets((,但它仍然不起作用。

#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 30
#define MAXLINE 256
int main(){
    char fileName[MAXNAME];
    FILE *originalFileCheck;
    printf("Input the name of the file to be opened: ");
    scanf("%s", fileName);
    originalFileCheck = fopen(fileName, "r");
    if(originalFileCheck == NULL){
        printf("The file %s was not opened successfully. The program will now terminate.n", fileName);
        exit(1);
    }
    else{
        FILE *tempFileWrite;
        char tempName[MAXNAME] = "temp.txt";
        tempFileWrite = fopen(tempName, "w");
        char newLine[MAXLINE];
        int lineNum;
        printf("Input the content of the new line: ");
        scanf("%s", newLine);
        printf("Input the number of the line you want to replace: ");
        scanf("%d", &lineNum); /* it terminates WITHOUT scanning this int*/
        char str[MAXLINE];
        int counter = 1;
        while(fgets(str, MAXLINE, originalFileCheck) != NULL){
            if(counter != lineNum){
                for(int i = 0; str[i] != '' && str[i] != 'n'; i++){
                    fputc(str[i], tempFileWrite);
                }
                fprintf(tempFileWrite, "n");
            }
            else{
                 fprintf(newLine, "%sn", tempFileWrite);
                }
            counter++;
        }
        fclose(tempFileWrite);
        fclose(originalFileCheck);
        ...
        return 0;
}

以下建议的代码:

  1. 干净地编译
  2. 检查输入错误
  3. 检查输出错误
  4. 执行所需的功能
  5. 发生错误时正确清理

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 30
#define MAXLINE 256
int main( void )
{
    char fileName[MAXNAME];
    FILE *originalFileCheck;
    printf("Input the name of the file to be opened: ");
    if( !fgets( filename, sizeof( fileName ), stdin) )
    {
        fprintf( stderr, "fgets to input 'original' file name failedn" );
        exit( EXIT_FAILURE );
    }
    // remove trailing newline
    fileName[ strcspn( fileName, "n" ) ] = '';
    originalFileCheck = fopen( fileName, "r" );
    if( !originalFileCheck )
    {
        perror( "fopen original file for read failed" );
        exit( EXIT_FAILURE );
    }

    FILE *tempFileWrite;
    char tempName[ MAXNAME ] = "temp.txt";
    tempFileWrite = fopen( tempName, "w" );
    if( !tempFileWrite )
    {
        perror( "fopen to write new file failed" );
        fclose( originalFileCheck );
        exit( EXIT_FAILURE );
    }
    char newLine[ MAXLINE ];
    int lineNum;
    printf("Input the content of the new line: ");
    if( !fgets( newLine, sizeof( newLine ), stdin ) )
    {
        perror"fgets to input new line content failed" );
        fclose( originalFileCheck );
        exit( EXIT_FAILURE );
    }
    printf("Input the number of the line you want to replace: ");
    if( scanf("%d", &lineNum) != 1 )
    {
        fprintf( stderr, "scanf for replacement line number failedn" );
        fclose( originalFileCheck );
        fclose( tempFileWrite );
        exit( EXIT_FAILURE );
    } 
    char str[MAXLINE];
    int counter = 1;
    while( fgets(str, sizeof( str ), originalFileCheck) )
    {
        if(counter != lineNum)
        {
            if( fputs( str, tempFileWrite ) == EOF )
            {
                perror( "fputs for original line failed" );
                fclose( originalFileCheck );
                fclose( tempFileWrite );
                exit( EXIT_FAILURE );
            }
        }
        else
        {
            if( fputs( newLine, tempFileWrite ) == EOF )
            {
                perror( "fputs for replacement line failed" );
                fclose( originalFileCheck );
                fclose( tempFileWrite );
                exit( EXIT_FAILURE );
            }
        }
        counter++;
    }
    fclose(tempFileWrite);
    fclose(originalFileCheck);
    return 0;
}

最新更新