-3
scanf(" %[^\n]", in);

然后例如,我输入 Knock Knock 并按回车键

但我的代码块在里面

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);
4

1 回答 1

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-type FILE*,因为那是 的返回fopen(),但你从来没有这样声明它。所以这永远不会编译那个错误。

2)每次打开带有w标志的文件时,它都会删除文件的全部内容。因此,如果您打算附加到文件以了解程序输出的历史记录,则需要a+在调用时使用该标志fopen()

3) 如果您无法打开文件而不是在程序从stdin. 此外,如果您要继续重新打开文件,请每次检查 NULL,因为尝试使用 NULL 文件指针(很可能是崩溃)会得到不可预测的结果。

4)scanf()可能导致来自用户输入(或恶意用户输入)的令人讨厌的缓冲区溢出......改为fgets()使用stdin已知长度的缓冲区。

您现在应该能够编译并运行此代码。在 Ubuntu 上使用 gcc 4.4.3 为我工作。运行后,您的“test.txt”文件应如下所示:

Knock Knock
Server: Who is there?
于 2011-05-14T01:37:15.553 回答