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);
}
}
答案 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