【问题标题】:Why is there a space after the first letter?为什么第一个字母后面有空格?
【发布时间】:2015-11-07 22:11:27
【问题描述】:

我有这个代码:

void text(){    
    FILE *fp;
    fp = fopen( "Text.txt", "w" );
    if (fp == NULL)printf("not open\n");
    char txt[100];
    char c;
while(1){   
    char c = getche();
    if (c == '\e')
        break;
    txt[0] = c;
    gets(txt+1);
    fprintf(fp, "%s ",txt);
}
    fclose(fp);
}

它工作正常,输出如下:Hello there.

void text(){    
    char fname[20] ; 
    puts("Write file name");
    scanf("%s",&fname); //input of the file name
    char ext[5] = ".txt";
    char fileSpec[strlen(fname)+strlen(ext)+1]; //file name assambly
    snprintf( fileSpec, sizeof( fileSpec ), "%s%s", fname, ext);
    FILE *fp;
    fp = fopen( fileSpec, "w" );
    if (fp == NULL)printf("not open\n");
    char txt[100];
    char c;
while(1){   
    char c = getche();
    if (c == '\e')
        break;
    txt[0] = c;
    gets(txt+1);
    fprintf(fp, "%s ",txt);
}
    fclose(fp);
}

我从一个网站上获取了上半部分,分别对其进行了测试,它确实有效。下半部分是相同的,当我将两者放在一起时,输出将是这样的:H ello there.

为什么会有那个空间?

【问题讨论】:

  • 无法回答。 getche() 不是标准 C 函数,'\e' 不是有效的转义码。您正在使用非标准(供应商特定)功能,它们之间的交互取决于与供应商如何做事相关的太多事情。
  • 永远不要使用gets()。它本质上是不安全的,已从语言中删除。 fgets() 可以安全地使用,尽管它需要更多的努力(它会在目标数组中留下尾随的 '\n',如果有的话)。

标签: c file printf space


【解决方案1】:

您没有提供足够的上下文(即,标准输入中的内容是什么?文件中的内容是什么?)。

但是您的fprintf(fp, "%s ",txt); 中有一个空格,这似乎是罪魁祸首。 (请注意,while 循环可以运行多次,因此会在输出到文件的内容之间添加空格)。

【讨论】:

  • 名称输入为text,文件为空
  • 大部分问题已被某人编辑,因此大多数上下文不再存在。我正在使用 Dev-C++ ,我尝试删除"%s" 之前的空格并使用fgets,但没有帮助。
  • 在合理的假设下,getche 是一种标准的东西,gets 没有行为不端,观察到的结果可能来自: 1. 键入 'H',2. 键入 "enter" 所以gets 立即终止 (!),3. 键入“ello world”,然后再输入一次。
  • 我输入了hello作为一个整体,我得到了h ello,然后我尝试在开始时按回车键,我在下一个循环中得到了一个完整的hello,似乎第一个循环只接受并打印一个字符。
猜你喜欢
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2014-02-28
相关资源
最近更新 更多