scanf(" %[^\n]", in);
然后例如,我输入Knock Knock并按Enter键
但是我的代码阻止了
if (strcmp ("Knock Knock",out)==0)
不起作用
请指导我,非常感谢!
char in[80],out[80];
void input(){
printf("Client: ");
scanf("%[^\n]",in);
fp=fopen("test","w");
if (!fp) return ;
fputs(in,fp);
fclose(fp);
}
fp=fopen("test","r");
fgets(out,81,fp);
fclose(fp);
fp=fopen("test","w");
if (strcmp ("Knock Knock",out)==0)
fputs("Server: Who is there?\n",fp);
答案 0 :(得分:4)
首先,代码的布局非常混乱,而且就其而言,它永远不会编译。你有一个你似乎永远不会调用的函数input()
,你将代码留在应该在另一个函数内部的函数之外,或者更好的是,所有函数都应该包含在main()
函数中,这样它可以执行。以下是您想要做的事情的清理示例:
#include <stdio.h>
char in[80],out[80];
int main()
{
printf("Client: ");
scanf("%[^\n]",in); //you really should use fgets() here
FILE* fp = fopen("test.txt","w");
if (!fp)
{
perror("Failed to open file");
return 1;
}
fputs(in,fp);
fputs("\n",fp);
fclose(fp);
fp = fopen("test.txt","r");
if (!fp)
{
perror("Failed to open file");
return 1;
}
fgets(out,80,fp);
fclose(fp);
fp = fopen("test.txt","a+");
if (!fp)
{
perror("Failed to open file");
return 1;
}
if (strcmp ("Knock Knock\n",out)==0)
fputs("Server: Who is there?\n",fp);
return 0;
}
一些重要的注释:
1)fp
有一个文件类型FILE*
,因为那是fopen()
的返回,但你从来没有声明它。所以这永远不会编译错误。
2)每次打开带有w
标志的文件时,都会删除文件的全部内容。因此,如果您打算附加到文件中以获取程序输出的历史记录,则在调用a+
时需要使用fopen()
标志
3)如果您无法打开文件而不是在程序从{{1}获取输入后“test.txt”为空的原因时出现问题,那将会出现某种类型的错误打印输出会很不错}。此外,如果您要继续重新打开文件,请每次检查一次NULL,因为您将尝试使用NULL文件指针(很可能是崩溃)而获得不可预测的结果。
4)stdin
可能导致来自用户输入(或恶意用户输入)的令人讨厌的缓冲区溢出...使用scanf()
和fgets()
来代替已知长度的缓冲区
您应该能够立即编译此代码并运行它。适用于Ubuntu的gcc 4.4.3。运行后,您的“test.txt”文件应如下所示:
stdin