【问题标题】:scanf(" %[^\n]", s); then how to strcmp in C?scanf(" %[^\n]", s);那么如何在C中strcmp?
【发布时间】:2011-05-14 00:45:22
【问题描述】:
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);

【问题讨论】:

  • 您是否意识到您将数据读入s,但试图与out进行比较?
  • "%[^\n]" 适用于 Linux 换行符。如果您在 Windows 中工作,您可能需要将 "%[^\r\n]" 作为 scanf 的格式说明符。
  • @mizo:Windows 不支持 scanf 格式字符串中的正则表达式,所以它根本无法在 Windows 上运行。
  • 我正在linux中开发这段代码
  • @Billy:这取决于库的实现,而不是操作系统。例如,这在 MinGW 中运行良好。它在libmingwex 中对MSVCRT 进行了一些扩展。

标签: c scanf strcmp


【解决方案1】:

首先,代码的布局非常混乱,就目前而言,它永远无法编译。您有一个似乎从未调用过的函数 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 标志的文件时,它都会删除文件的全部内容。因此,如果您打算附加到文件以记录程序输出的历史记录,则需要在调用 fopen() 时使用 a+ 标志

3) 如果您无法打开文件而不是在程序从stdin 获取输入后为“test.txt”为空而摸不着头脑,最好打印出某种类型的错误。此外,如果您要继续重新打开文件,请每次检查 NULL,因为尝试使用 NULL 文件指针会得到不可预测的结果(很可能是崩溃)。

4) scanf() 可能会导致用户输入(或恶意用户输入)导致严重的缓冲区溢出...改为使用 fgets() 和 stdin 到已知长度的缓冲区。

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

Knock Knock
Server: Who is there?

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2023-04-03
    • 2015-07-15
    • 2016-04-14
    相关资源
    最近更新 更多