scanf ("% [^ \ n]", s);тогда как strcmp в C? - PullRequest
0 голосов
/ 14 мая 2011
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);

1 Ответ

4 голосов
/ 14 мая 2011

Во-первых, компоновка кода очень запутанная, и в ее нынешнем виде она никогда не будет компилироваться.У вас есть функция 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) Было бы неплоховыведите распечатку ошибки, если вам не удалось открыть файл, вместо того, чтобы почесать голову, почему «test.txt» пуст после того, как программа взяла ввод из stdin.Также, если вы собираетесь продолжать открывать файл, проверяйте NULL каждый раз, так как вы собираетесь получить непредсказуемые результаты при попытке работать с указателем файла NULL (скорее всего, сбой).

4) scanf() может привести к неприятным переполнениям буфера от ввода пользователя (или злонамеренного ввода пользователя) ... вместо этого используйте fgets() с stdin для буфера известной длины.

Youдолжен быть в состоянии скомпилировать этот код сейчас и запустить его.У меня работает с gcc 4.4.3 на Ubuntu.После запуска ваш файл «test.txt» должен выглядеть следующим образом:

Knock Knock
Server: Who is there?
...