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

===============>>#1 票数:1

因为您有两个调用scanf ..

在第一个中,您正在成功读取输入“ A”或“ X”。 在下一个调用中,您正在读取换行符( \\n ),该换行符先前已被压入同一变量ch 因此它不满足任何if子句,而只是从程序中出来。

而是再次调用临时变量。

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

此外, fgets优先于gets

===============>>#2 票数:0

有很多程序可以编译但不能正常运行。 这就是为什么在语法错误和运行时/逻辑错误之间进行区分的原因。

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

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

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

char ch, junk, file_name[25];
:
scanf("%c",&ch);
scanf("%c",&junk);

但是,令人遗憾的是,这种方法可能存在许多其他问题。 如果您想要一个不错的线路输入功能,可以在这里找到一个。 这比使用gets()好得多,后者本质上是不安全的。

它具有缓冲区溢出检测和预防功能,如果输入线太长会自动刷新,并及时输出等等。 一旦使用它来获取输入行,您所要做的就是将其与所需的内容进行比较,例如:

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

===============>>#3 票数: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

  ask by user3555512 translate from so

未解决问题?本站智能推荐: