【问题标题】:how to loop user input and copy it to file until "exit" string in entered using C?如何循环用户输入并将其复制到文件中,直到使用 C 输入“退出”字符串?
【发布时间】:2013-04-27 15:55:20
【问题描述】:

我想编写一些小程序,当最大输入为 100 个字符时从用户(使用控制台)获取字符串,并且当用户按下回车键时 - 它会将输入复制到某个文件。 当用户输入字符串“exit”时我想退出循环

例如: “你好你好吗?” “布拉布拉” “出口” 我只是不知道如何使它工作-我应该使用scanf吗?获取字符?得到?

char* buf ;
int i;


 buf = (char*)calloc(100, sizeof(char));
 while(1) 
  {
     fgets(s, sizeof(s), stdin);
     if (strcmp(s , "exit") == 0)
       break;
     else
   ...write to file...
   }

我需要手动输入“\0”吗?

谢谢!

【问题讨论】:

    标签: c string console user-input


    【解决方案1】:

    fgets() 很好,但在某些实现中,它会将尾随换行符 (\n) 放在行尾。您必须删除它才能进行比较,或者准备您的比较以同时接受 "exit""exit\n"

    if (strcmp(s , "exit") == 0 || strcmp(s , "exit\n") == 0)
       break;
    

    fgets(s, sizeof(s), stdin);
    char *p = strchr(s, '\n');
    if (p) *p = 0;
    
    if (strcmp(s , "exit") == 0)
        break;
    

    旁注:除非您打算将字符串返回给调用者函数,否则根本不需要使用calloc()。改用自动数组:

    char s[0x100]; // or whatever
    

    【讨论】:

    • 谢谢!另一件事我不太确定——如果我有一个数组并且我想把这个字符串放在那里——我现在应该扔掉每个字母并复制它:arr[i] = s[i] 吗?直到我到达'\0'?
    • @user1386966 可以,但不要手动操作。 strncpy(dest, buf, destsize);,但请阅读 strncpy() 的手册页,因为如果不检查其返回值是不安全的。
    • “某些实现”是符合标准的实现的超集,“在换行符之后不会读取其他字符(保留)”。如果有空格(根据 size 参数),fgets 必须将换行符存储在缓冲区中。
    • @DanielFischer 感谢您的澄清。
    • @H2CO3 如果我可以保证我的目的地足够大来存储字符串(例如,我在上面的示例中从p 中减去了s,结果小于@987654334 @),那我为什么要使用strncpy
    【解决方案2】:

    我应该使用 scanf 吗?获取字符? fgets?

    以上任何一种,但您的while 循环应转换为:读取输入时,输入不是“退出”。您的while 循环当前转换为:而世界还没有结束。

    我建议如下:

    while (fgets(s, sizeof s, stdin) == s && strcmp(s, "exit\n") != 0) {
        /* ... */
    }
    

    我需要手动输入“\0”吗?

    没有;仔细选择工具允许您使用标准字符串库对标准 I/O 库(在上面的 fgets/strcmp 代码的情况下)生成的字符串进行操作,或者通过其他更复杂的方式对非字符串进行操作.


    PS。无需转换 mallocsizeof (char) 在 C 中总是之一。

    【讨论】:

      【解决方案3】:

      对于您的问题,fgets() 会自动附加一个\0

      来自C++ Reference

      A terminating null character is automatically appended after the characters copied to str.

      请注意,fgets() 在按下 Enter 时会停止读取并附加一个 \n,但是,根据您的问题,我认为这可能对您有利。

      fgets()scanf()的区别,可以找here.好好讨论。

      【讨论】:

      • @user1386966 请不要在每个答案下留下相同的评论。它被认为是乱扔垃圾。
      • 我知道@H2CO3 已经回答了您的问题。如果讨论集中在一个领域就好了。提高了将来访问此主题的人们的可读性。
      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      相关资源
      最近更新 更多