【问题标题】:Why is fgets() and/or fputs() removing the spaces from my string?为什么 fgets() 和/或 fputs() 从我的字符串中删除空格?
【发布时间】:2013-07-23 19:17:01
【问题描述】:

我正在尝试接收用户输入字符串并将其写入文件。然而,无论我做什么,输出总是从字符串中删除空格。

我认为使用gets()/puts() 的全部目的是读取/输出字符串中的所有字符,直到遇到换行符。

谁能告诉我我做错了什么??

int main (void){
    char userInput[100];
    char filename[50];
    FILE *cfPtr;

    printf("Enter name of file to open: ");
    scanf("%s", &filename);

    cfPtr = fopen(filename, "a+");

    printf("Enter text to add to file: \n");
    fgets(userInput, 100, stdin);

    while (strcmp( userInput, "0") != 0) {
        fputs( userInput, cfPtr);
        fgets(userInput, 100, stdin);
    } // end while

    fclose( cfPtr );

    system("pause");
} // end main

【问题讨论】:

  • "0" 不是换行符。它是“0”。您正在将整个字符串与“0”进行比较,而不仅仅是一个字符。也许你的意思是 fgetc?
  • 对不起,我应该解释一下。我正在对照“0”检查字符串,以便在用户输入零时程序将退出。否则,除 0 以外的任何内容都将写入文本文件。
  • 我仍然不认为 strcmp 会起作用,除非用户要输入一个“0”来结束?
  • 是否需要清除或刷新用户输入?
  • 正确,用户输入单个“0”结束。

标签: c file-io fgets fputs


【解决方案1】:

谁能告诉我我做错了什么??

我注意到的第一个错误是在 scanf 中,对于带有 %s 的字符串,您使用的是 &:

scanf("%s", &filename);
            ^
            |
            remove it, undefined behavior

应该只是:

scanf("%s", filename);

您的代码在此之后将无法工作。我找不到任何其他语法错误,所以我相信这是您代码中的主要错误。

【讨论】:

  • 这是一个非常好的和正确的 UB 桥,OP 在修复这个错误之前甚至不应该进一步寻找。但是,我看不出它有任何不起作用的原因:)
  • @H2CO3 没有得到 :( :( I don't see any reason why it wouldn't work ?我需要改进/更改答案吗?
  • 不,你没有。我只是指出,尽管尝试推理 UB 毫无意义,但我仍然希望这种特殊情况能够奏效:)
  • 明白了。无论如何,感谢您的链接,Grijesh。作为编程新手,我认为这将提供非常丰富的信息。
  • @Grijesh 在我的机器上,代码在有和没有符号的情况下执行相同。但是,这两种方法都不能解决我删除空格的问题,但至少我知道我的代码可以在其他机器上运行。
【解决方案2】:

1) fgets() 和 fputs() 不会从您的字符串中删除任何空格。

2) 一个潜在的“陷阱”是 fgets() 将保留“Enter”字符,您可能不会将其视为字符串的一部分。

3) 您的代码中的问题可能与您的“scanf()”有关 - 您应该传递“filename”(它是一个数组),而不是“&filename”(它是重复的冗余)。

4) 更好的是,您可以考虑用“fgets()”代替“scanf()”。

恕我直言...

PS: 这是使用 fgets() 和朋友的一个很好的链接:

http://beej.us/guide/bgc/output/html/multipage/gets.html

【讨论】:

  • 感谢大家的反馈,但我的编译器似乎有问题,因为我在删除空格时仍然遇到同样的问题。如果我输入字符串“add this string”,它会将字符串“addthisstring”写入文件。所以我不确定发生了什么。有人可以尝试在他们的机器上运行代码,看看他们是否可以让它正常工作吗?
  • 为我工作。有点。必须比较 "0\n" 来说明新行。空间似乎是守恒的。系统(“暂停”)不起作用。你在什么操作系统上?
  • 我在 Windows 7 上。感谢您确认它可以正常工作!!我已经把这段代码弄乱了一个多小时,尝试了 fgets/gets/scanf 和相应的 print/puts 函数的每一种组合,试图让它工作。至少现在我知道这不是代码。也许它与我在 Visual Studio 上的编译器或项目有关?我会继续搞砸的。再次感谢!
  • Visual C++ 的运行方式与 g++ 略有不同。有一些差异。我也会为文件名抓取添加“%s\n”。如果没有它,它似乎会在输出中添加一个额外的换行符。
【解决方案3】:

这在 g++ 和 linux 下运行。

int main (void){  
  char userInput[100];  
  char filename[50];  
  FILE *cfPtr;

  printf("Enter name of file to open: ");  
  scanf("%s\n", filename);

  cfPtr = fopen(filename, "a+");

  printf("Enter text to add to file: \n");  
  fgets(userInput, 100, stdin);

  while (strcmp( userInput, "0\n") != 0) {  
      fputs( userInput, cfPtr);  
      fgets(userInput, 100, stdin);  
  } // end while

  fclose( cfPtr );

  //system("pause");  
} // end main

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2021-01-27
    • 2015-09-22
    • 2011-09-21
    • 2017-11-20
    相关资源
    最近更新 更多