scanf(“%[^ \ n]”,s);然后如何在C中strcmp?

时间:2011-05-14 00:45:22

标签: c scanf strcmp

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

1 个答案:

答案 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