gpt4 book ai didi

c - scanf() 和 gets() 的意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:29 24 4
gpt4 key购买 nike

我想使用以下代码一次性向文件写入一行(包括空格):-

//in main
char ch[40];
FILE *p;
char choice;
p=fopen("textfile.txt","w");
printf("%s\n","you are going to write in the first file" );
while (1)
{
gets(ch);// if i use scanf() here the result is same,i.e,frustrating
fputs(ch,p);
printf("%s\n","do you want to write more" );
choice=getche();
if (choice=='n'|| choice=='N')
{
break;
}
}

上面代码的结果让我很沮丧,很难解释。但我仍然会尝试。如果我输入,比如说,

"my name is bayant." 

然后按回车键屏幕上出现的语句是

"do you want to write more"

到现在为止还不错,但是当我按下一个不是'n'或'N'的键时(根据程序逻辑的要求写更多行)然后消息

"do you want to write more"

再次打印。现在,如果我按“n”或“N”以外的其他键,屏幕上将打印同一行。遵循此过程并打印语句

"do you want to write more"

4 次,这是单词的数量,即在这种情况下为 4。通过遵循这个不灵活的过程,我在我的文件中得到了所需的行,但是如果响应第一次打印语句

"do you want to write more"

我按'n'或'N'然后只有第一个词,即在这种情况下的“我的”打印在文件上。那么一次性在文件上写入完整行的解决方案是什么?为什么 gets() 和 fputs() 在这种情况下似乎无效?提前thanxxx。

最佳答案

如果你使用

scanf("%s",ch);

(我假设这就是您所说的“scanf”的意思),这将读取一个字符串。如果你输入

"my name is bayant."

这将产生 4 个字符串:“my”、“name”、“is”和“bayant”。

请注意,根据您的描述,您不想读取字符串,您想要读取。要使用 scanf 读取整行文本,您可以使用:

scanf("%[^\n]", ch);
scanf("%*c");

这意味着:第 1 行:“阅读所有内容,直到找到\n 字符”。

第 2 行:“读取并忽略那个 '\n' 字符(留在缓冲区中)”。

我应该说这不是一个安全的解决方案,因为用户很容易溢出“ch”缓冲区,但我相信如果在您的特定情况下这是一个真正的问题,您可以找到更好的方法来做到这一点。

关于c - scanf() 和 gets() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22249422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com