0
#include <stdio.h>
#include <string.h>


void main() {

    FILE* fp;
    char line[1024];
    char filename[1024];
    int length;
    int counter=0;

    while (1) {
       // fopen(filename, "w");
        int op = 0;
        printf("1. new file");
        scanf("%d", &op);

        switch (op) {

        case -1: break;
        case 1:

            printf("filename>>");
            scanf("%s", filename);
            length = strlen(filename);
            printf("length = %ld \n", strlen(filename));
            filename[length] = '.';
            filename[length + 1] = 't';
            filename[length + 2] = 'x';
            filename[length + 3] = 't';
            filename[length + 4] = '\0';

            fp=fopen(filename, "w");

            while (fgets(line, sizeof line, stdin) != NULL)
            { 
                if (line[0] == 'q' || line[0] == 'Q')
                {
                    printf("end of line \n");
                    fclose(fp);
                    break;
                }
                else
                    fputs(line, fp);
            }
        }
    }
}

我制作了这段代码来制作我想要的文本文件。但问题是,当我运行这个程序时,它从第二行写入输入,而不是第一行。

为什么会发生这种情况?我想从第一行写输入。如何更改此代码以在第一行编写?

4

2 回答 2

1
scanf("%s", filename);

当您从键盘输入文件名时,您键入文件名,然后按 ENTER。scanf函数读取filename但不使用 ENTER 字符。然后当你使用时fgets,它会读取这个 ENTER 字符,然后在你的文件中写入一个空行。

为了解决这个问题,你可以使用getchar()afterscanf("%s", filename);来消耗 enter 字符。您应该在函数1023之前添加: scanf 的缺点%sscanf

scanf("%1023s", filename);
getchar();

或者您可以fgets改用:

fgets(filename, sizeof(filename), stdin);

还有一件事,breakinswitch语句并不能帮助您退出第一个while循环 ( while (1) {...})。您应该使用一个条件来退出此循环,例如:

char ch = 'a';
while (ch != 'q') {

  ...
  switch (op) {
      case -1: ch = 'q'; break; // type -1 will exit the first while loop.

switch应该有例外的default情况。

 switch (op) {
    ...
    default:
       // handle the exception here.
于 2020-05-21T19:32:25.720 回答
0

可能的原因是您在标准输入上的 scanf 之后使用 fgets。

请参阅在同一程序中使用 scanf 和 fgets?.

于 2020-05-21T18:30:08.327 回答