【问题标题】:How to add a whitespace in between every string inputted into a text file如何在输入到文本文件的每个字符串之间添加空格
【发布时间】:2015-05-22 05:15:01
【问题描述】:

每次我在我的文本文件中输入一个字符串时,我都希望在输入的字符串之间有一个空格,如下所示:

输入:

堆栈

溢出

预期输出:

堆栈溢出

当前输出:

堆栈溢出

这是我的功能代码:

void addDataToTextFile(FILE *fileptr)
{
    char text[100];
 
    fileptr = fopen("textfile.txt", "a");
    printf("\n\nPlease enter some text: ");
    fflush(stdin);
    gets(text);
    fprintf(fileptr, text);
    fclose(fileptr);
    printf("\n\nText has been added");
    getch();
    return;
}

【问题讨论】:

    标签: c printf text-files fgets


    【解决方案1】:

    gets 已弃用,使用 fgets 并将结尾的换行符替换为空格:

    void addDataToTextFile(FILE *fileptr)
    {
        char text[100];
        char *ptr;
    
        fileptr = fopen("textfile.txt", "a");
        printf("\n\nPlease enter some text: ");
        fflush(stdin); /* You want fflush(stdout); */
        fgets(text, sizeof text, stdin);
        if ((ptr = strchr(text, '\n'))
            *ptr = ' ';
        fprintf(fileptr, text); /* Wrong, use fprintf(fileptr, "%s", text); */
        fclose(fileptr);
        printf("\n\nText has been added");
        getch();
        return;
    }
    

    【讨论】:

      【解决方案2】:

      开始

      1. 在使用返回的指针之前始终检查fopen() 的返回值。
      2. fflush(stdin); 产生未定义的行为,有问题且无用。##
      3. gets() 很危险。请改用fgets()
      4. fprintf(fileptr, text); 用法错误。

      注意:fgets() 扫描并存储来自输入的跟踪 \n(通过 ENTER 键按下)。更正上述问题后,要在每个输入字符串后添加一个空格,您可以搜索并用 替换跟踪\n,然后将字符串写入文件。 Alter Mann 先生在下方/上方的answer 中很好地提到了这一点。


      ##:按照C11 标准,章节7.21.5.2,第2 段,

      int fflush(FILE *stream);

      如果流指向输出流或更新流,其中最近的 未输入操作,fflush 函数会导致该流的任何未写入数据 被交付到宿主环境中写入文件; 否则,行为是 未定义。

      因此,stdin 不是输出流,与 fflush() 一起使用时会导致 UB。

      一些不错的读物:thisthis

      【讨论】:

      • fflush(stdin) 是未定义的行为。这意味着它始终是一个错误并且使用起来有潜在的危险。
      • @Lundin 是的,先生,我只想这么说。会用你的话更新。谢谢,
      【解决方案3】:

      FILE 指针未声明 fprintf 缺少第二个参数

      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h>
      int main()
      {
              FILE *fileptr;
           char text[100];
      
              fileptr = fopen("textfile.txt", "a");
              printf("\n\nPlease enter some text: ");
              fflush(stdin);
              gets(text);
              printf("INPUT = %s\n",text);
              fprintf(fileptr,"%s ", text);
              fclose(fileptr);
              printf("\n\nText has been added");
      }
      

      【讨论】:

      • 你是怎么得出结论的FILE pointer was not declared?我认为它在函数参数中,不是吗?另外,请不要鼓励使用gets(),这真的很糟糕,AFAIK。
      猜你喜欢
      • 2015-06-04
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多