为啥这段代码在第二行写输入?

     2023-03-17     90

关键词:

【中文标题】为啥这段代码在第二行写输入?【英文标题】:Why does this code write input on second line?为什么这段代码在第二行写输入? 【发布时间】:2020-09-08 07:48:18 【问题描述】:
#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);
            
        
    

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

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

【问题讨论】:

我读过,但我不能完全理解。 【参考方案1】:

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

见Using scanf and fgets in the same program?。

【讨论】:

【参考方案2】:
scanf("%s", filename);

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

为了解决这个问题,你可以在scanf("%s", filename);之后使用getchar()来消耗回车符。您应该在scanf 函数中的%s 之前添加1023:Disadvantages of scanf。

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

或者您可以使用fgets 代替:

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

还有一点,switch 语句中的break 并不能帮助您退出第一个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.

【讨论】:

为啥我的平移手势只能在第二次输入后识别事件?

】为啥我的平移手势只能在第二次输入后识别事件?【英文标题】:Whydoesmypangestureonlyrecognizetheeventafterthesecondinput?为什么我的平移手势只能在第二次输入后识别事件?【发布时间】:2015-12-2705:34:51【问题描述】:我设置了平移手... 查看详情

javascript,为啥在播放视频时第二行无法从第一行替换?

】javascript,为啥在播放视频时第二行无法从第一行替换?【英文标题】:javascript,whythesecondtextlinecouldn\'treplacefromfirstlinewhilethevideoisplaying?javascript,为什么在播放视频时第二行无法从第一行替换?【发布时间】:2013-04-0321:01:49【... 查看详情

在wps中,第一行字数没满,怎么把第二行的合并上来,除了在第二行开头按backspace之外

...必须要事先把它从“视图"中调出来才行。 参考技术B在第一行字尾按DEL 参考技术C以WPS 2019版本为例:关于word中如何删除空行/回车符,您可使用WPS参考下方步骤完成操作:1、打开「文字(Word」;2、点击「开始-文字工具... 查看详情

为啥按钮只有在第二次点击后才起作用? (反应)

】为啥按钮只有在第二次点击后才起作用?(反应)【英文标题】:Whybuttonworksonlyaftersecondclick?(reactjs)为什么按钮只有在第二次点击后才起作用?(反应)【发布时间】:2020-08-1908:46:14【问题描述】:我有登录按钮,如果每个输... 查看详情

为啥此代码仅在第二次运行时才起作用?

】为啥此代码仅在第二次运行时才起作用?【英文标题】:Whydoesthiscodeonlyworkthesecondtimeitisrun?为什么此代码仅在第二次运行时才起作用?【发布时间】:2021-06-0901:42:42【问题描述】:在我的地图应用程序中,当我使用除坐标(纬... 查看详情

为啥这段代码不等待输入[重复]

】为啥这段代码不等待输入[重复]【英文标题】:Whydoesthiscodenotwaitforinput[duplicate]为什么这段代码不等待输入[重复]【发布时间】:2015-11-2407:40:56【问题描述】:我希望代码停止并再次等待输入,但它运行时就像用户每次都按Enter... 查看详情

如果内容不适合视图的第一行,则 UILabel 在第二行

】如果内容不适合视图的第一行,则UILabel在第二行【英文标题】:UILabelonsecondlineifthecontentdoesn\'tfitintheview\'sfirstline【发布时间】:2017-02-2112:17:01【问题描述】:描述我的情况的最佳方式是使用图像。我所拥有的是一个包含几个UI... 查看详情

当标题在第二行中断时,正文不会溢出剪辑正确

】当标题在第二行中断时,正文不会溢出剪辑正确【英文标题】:Whenheadlinebreaksinsecondline,thebodytextdoesnotoverflowclipcorrect【发布时间】:2021-05-2500:11:38【问题描述】:如果我有一个长标题,根据字符串的长度分成两行,则正文文本... 查看详情

为啥 MapReduce 第二份工作不会排序?

】为啥MapReduce第二份工作不会排序?【英文标题】:WhyMapReducesecondjobwon\'tsort?为什么MapReduce第二份工作不会排序?【发布时间】:2019-12-1022:27:31【问题描述】:我对这段代码有一点问题,第一份工作运行良好,将每个客户的价格... 查看详情

在第二行的导航栏上添加段控制器

】在第二行的导航栏上添加段控制器【英文标题】:Addingsegmentcontrolleronnavigationbarinthesecondrow【发布时间】:2013-08-1501:11:49【问题描述】:我想在导航栏上添加一个段控制器不是作为标题,而是像这样:我该怎么做?【问题讨论... 查看详情

为啥 Spark 查询在第二次执行时运行得更快?

】为啥Spark查询在第二次执行时运行得更快?【英文标题】:WhydoesaSparkqueryrunfasterwhenit\'sexecutedasecondtime?为什么Spark查询在第二次执行时运行得更快?【发布时间】:2020-10-0719:03:10【问题描述】:我第二次运行查询时速度明显更快... 查看详情

为啥我的模型在第二个 epoch 过拟合?

】为啥我的模型在第二个epoch过拟合?【英文标题】:Whyismymodeloverfittingonthesecondepoch?为什么我的模型在第二个epoch过拟合?【发布时间】:2020-12-0323:15:54【问题描述】:我是深度学习的初学者,我正在尝试训练一个深度学习模型... 查看详情

l2-026.小字辈(代码片段)

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给出家族人口总数N(不超过100000的正整数)——简单起见,我们把家族成员从1到N编号。随后第二行给出N个编号,其中第i个编号对应... 查看详情

l2-026.小字辈(代码片段)

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给出家族人口总数N(不超过100000的正整数)——简单起见,我们把家族成员从1到N编号。随后第二行给出N个编号,其中第i个编号对应... 查看详情

题解lcis(代码片段)

题目描述  给定两个整数序列,写一个程序求它们的最长上升公共子序列。 输入格式  每个序列用两行表示,第一行是长度L,第二行是该序列。输出格式  在第一行,输出该LCIS的长度。第二行,输出该LCIS。 输入... 查看详情

如何对组进行排序,以使我在第一行中获得最大的数字,在第二行中获得最小的数字,在第三行中获得第二大的数字,依此类推

】如何对组进行排序,以使我在第一行中获得最大的数字,在第二行中获得最小的数字,在第三行中获得第二大的数字,依此类推【英文标题】:HowtosortagroupinawaythatIgetthelargestnumberinthefirstrowandsmallestinthesecondandthesecondlargestinthethir... 查看详情

为啥我的 reg ex 不捕获第二行和后续行?

】为啥我的regex不捕获第二行和后续行?【英文标题】:Whydoesmyregexnotcapture2ndandsubsequentlines?为什么我的regex不捕获第二行和后续行?【发布时间】:2019-04-0114:55:10【问题描述】:更新我尝试将RegexOptions.Singleline添加到我的regex选项... 查看详情

为啥 uibmodals 只能在第二次调用时拖动?

】为啥uibmodals只能在第二次调用时拖动?【英文标题】:Whyareuibmodalsonlydraggableonsecondcall?为什么uibmodals只能在第二次调用时拖动?【发布时间】:2020-02-0710:39:44【问题描述】:我将.draggable()放在了我的模态框上,但它们仅适用于... 查看详情