为什么这段代码编译但实际上没有工作?

时间:2014-04-21 05:32:31

标签: c compilation

12到23行。但是当添加if语句时,实际上并没有运行。它确实编译并运行。它询问第一个printf语句然后在我选择一个字符时终止。为什么会发生这种情况,我该如何解决它。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char ch, file_name[25];
   FILE *fp;
   printf("Enter [A] and select file or [X] to exit:"); // Prompt user to select file or exit
   scanf("%c",&ch);
   scanf("%c",&ch);

   if (ch=='A')
   {
       printf("Enter the file name\n"); // if user chooses 'A' this code should run
       gets(file_name);

       fp = fopen(file_name,"r"); // reading file

       if( fp == NULL )
       {
           perror("File not found.\n");
           exit(EXIT_FAILURE);
        }
        printf("Contents of %s are:\n", file_name);

        while( ( ch = fgetc(fp) ) != EOF )
            printf("%c",ch);
    }
    else if (ch=='X')
    {
        printf("Exiting program...");
        exit(0);
    }
}

3 个答案:

答案 0 :(得分:1)

因为您有两次拨打scanf ..

在第一个中,您正在阅读您的输入&#39; A&#39;或者&#39; X&#39;成功。 在下一个调用中,您正在读取之前被压入同一变量\n的换行符(ch)。所以它并不满足任何if条款,只是出于程序..

而是第二次调用临时变量..

char temp;
scanf("%c", &temp);

fgets优先于gets

答案 1 :(得分:0)

有一大类程序编译但运行不正常。这就是语法错误和运行时/逻辑错误之间的区别。

scanf("%c",&ch);
scanf("%c",&ch);

假设是为了摆脱换行符,但将其读入ch是一个坏主意,因为这应该保留第一个字符。

如果是这种情况,只需将其读入一些垃圾变量,以便保留ch

char ch, junk, file_name[25];
:
scanf("%c",&ch);
scanf("%c",&junk);
但遗憾的是,这种方法可能存在许多其他问题。如果你想要一个合适的线路输入功能,你可以找到一个here。这比使用本身不安全的gets()要好得多。

具有缓冲区溢出检测和防止,输入线自动冲洗时间过长,输出迅速等特点。一旦你用它来获得输入行,你需要做的就是将它与你想要的东西进行比较,例如:

if (strcmp (buff, "A") == 0)
    doSectionA();
else
    if (strcmp (buff, "X") == 0)
        doSectionX();

答案 2 :(得分:0)

我猜你没有从文件中正确阅读,试试:

char buff[255];  //define buffer to read lines

while ( !feof(fp ) ){
         memset(buff, '\0', sizeof( buff) );
         fgets(buff, 255, (FILE*)fp);
         printf("%s", buff );
      }

fclose(fp); //don't forget to close