1

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

例如:“嗨,你好吗?” “ bla bla” “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" 吗?

谢谢!

4

3 回答 3

2

fgets()很好,但在某些实现中,它会将尾随换行符 ( \n) 放在行尾。您必须将其删除才能进行比较,或者准备您的比较以同时接受"exit"and "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
于 2013-04-27T15:59:36.690 回答
2

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

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

我建议类似:

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

我需要手动输入 "\0" 吗?

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


PS。不需要强制转换malloc,并且在 Csizeof (char)始终是一。

于 2013-04-27T15:59:57.570 回答
1

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

来自C++ 参考

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

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

对于 和 之间的区别fgets()scanf()可以在这里找到一个很好的讨论。.

于 2013-04-27T16:01:29.800 回答