2013-04-27 68 views
0

我想编写一些从用户(使用控制台)获取字符串的小程序,当最大输入为100个字符时,以及当用户按下输入时 - 它会将输入复制到某个文件。 我想退出循环时,用户输入字符串“退出”如何循环用户输入并将其复制到文件,直到使用C输入“退出”字符串?

例如: “嗨,你好吗?” “bla bla” “exit” 我只是不知道如何使它工作 - 我应该使用scanf吗? getchar函数?与fgets?

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”吗?

谢谢!

回答

2

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 
+0

谢谢!另一件事,我不太确定 - 如果我有一个数组,我想把这个字符串放在那里 - 我现在应该抛出每封信并复制它:arr [i] = s [i]?直到我到'\ 0'? – user1386966 2013-04-27 16:07:13

+0

@ user1386966是的,但不要手动执行此操作。 'strncpy(dest,buf,destsize);',但是请阅读'strncpy()'的手册页,因为如果你不检查它的返回值是不安全的。 – 2013-04-27 16:08:35

+1

“某些实现”是符合实现的超集,“在换行符(**被保留**)之后不会读取其他字符”。如果有空格(根据size参数),'fgets'必须将新行存储在缓冲区中。 – 2013-04-27 16:17:02

2

我应该用scanf函数? getchar函数?与fgets?

以上任何一项,但您的while循环都应转换为:输入被读取且输入不是“退出”时。你的while循环现在转化为:虽然世界没有结束。

我建议是这样的:

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

我是否需要手动将 “\ 0”?

否;通过仔细选择工具,您可以使用标准I/O库生成的字符串(上述代码为fgets/strcmp)使用标准字符串库或通过其他更复杂的方式处理非字符串。


PS。有没有必要投malloc,并sizeof (char)总是之一C.

+0

谢谢!它帮助很多 – user1386966 2013-04-27 16:08:14

1

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

C++ Reference

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

请注意,fgets()停在输入的新闻阅读并附加\n过,但是,从你的问题,我推测,这可能有利于你。

对于fgets()scanf()之间的差异,可以找到一个很好的讨论here.

+0

@ user1386966请不要在每个答案下留下相同的评论。它被认为是乱抛垃圾。 – 2013-04-27 16:09:22

+0

我知道@ H2CO3已经回答了你的问题。如果讨论集中在一个领域,这将是一件好事。提高未来访问此主题的人员的可读性。 – 2013-04-27 16:10:23

+0

对不起 - 我删除它。 – user1386966 2013-04-27 16:10:24

相关问题