Member 13933893 Ответов: 3

Как сравнить 2 пароля, введенных пользователем, а затем вывести его в файл только в том случае, если пароли совпадают


программа >C : мне нужно, чтобы пользователь ввел свой пароль, а затем заставил его ввести его еще раз

только если 2 совпадают, программа должна выйти и сохранить ее в файл.

Это то, что я получил до сих пор.

Буду признателен за любую дополнительную помощь по этому же вопросу.

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>  /* For exit() function */
int main()
{
   char username[1000];
   char passwordone[1000];
   char passwordtwo[1000];

   FILE *fptr;

   fptr = fopen("program.txt", "w");
   if(fptr == NULL)
   {
      printf("Error!");
      exit(1);
   }
   
   printf("Enter your username\n");
   gets(username);

   fprintf(fptr,"%s", username);
 
   printf("Enter your password\n");
   gets(passwordone);

   printf("Enter your password again\n");
   gets(passwordtwo);

   if strcmp(passwordone,passwordtwo ==0)
   printf("The Passwords match");
   else
   printf("The passwords do not match");
   
   fprintf(fptr,"%s", password);
   fclose(fptr);

   return 0;
}

3 Ответов

Рейтинг:
20

CPallini

Быстрое исправление: переход от

Цитата:
если strcmp(passwordone,passwordtwo ==0)
printf("пароли совпадают");
еще
printf("Пароли не совпадают");

fprintf(fptr,"%s", пароль);
к
if (strcmp(passwordone,passwordtwo)==0)
 {
   printf("The Passwords match");
   fprintf(fptr,"%s", passwordone);
 }
 else
  printf("The passwords do not match");


Пожалуйста, обратите внимание:
  • Никогда, никогда не используйте gets. Не использовать fgets вместо.
  • Сохранение незашифрованных паролей-очень плохая практика.


Исправлена ошибка, благодаря Нелек


[обновление]
Цитата:
Однако я не в состоянии понять концепцию цикла while

Вы можете организовать свою программу таким образом
#include <string.h>

int main()
{
  char username[1000];
  char passwordone[1000];
  char passwordtwo[1000];

  FILE *fptr;


  fptr = fopen("program.txt", "w");
  if(fptr == NULL)
  {
    printf("Error!");
    return -1;
  }

  printf("Enter your username\n");
  gets(username);

  fprintf(fptr,"%s", username);

  while (1)
  {
    printf("Enter your password\n");
    gets(passwordone);

    printf("Enter your password again\n");
    gets(passwordtwo);

    if ( strcmp(passwordone, passwordtwo) == 0)
      break; // this exits the while loop

    printf("The passwords do not match\n");
  }

  printf("The Passwords match\n");
  fprintf(fptr,"%s", passwordone);
  fclose(fptr);

  return 0;

[/обновление]


KarstenK

лучше всегда пользоваться брекетами. ;-)

CPallini

Это вопрос личного вкуса.

Dave Kreskowiak

..и правила кодирования, если вы работаете в таком доме.

CPallini

Вы знаете, я клингонский разработчик.

Nelek

Спасибо за то, что вы решили проблему, но вы уверены, что это был я?

Кстати, вы забыли фразу "Не выходите, если не совпадаете" ;)

Рейтинг:
2

Nelek

Привет,

if strcmp(passwordone,passwordtwo ==0)
разве так не должно быть
if (strcmp(passwordone,passwordtwo) ==0)
или по крайней мере
if strcmp(passwordone,passwordtwo) ==0 /* NOT VALID */


другой момент, Вы пытаетесь писать:
fprintf(fptr,"%s", password);
но "password- его не существует.

другой момент, если вы хотите записать его, когда 1 и 2 одинаковы... тогда действия с файлом должны идти в пределах if это дает нормально, если они одинаковы

и если они не совпадают, вы не должны выходить из программы, что означает, что вы должны упаковать свой код в итерацию / цикл, который заканчивается только после сопоставления и записи в файл.

Примечание: Для нас предоставление вам рабочего кода будет стоить не так уж много, но цель состоит в том, чтобы вы научились. Поэтому, пожалуйста, подумайте об этих подсказках и исправьте свой код. Если вы снова застряли, не стесняйтесь возвращаться и спрашивать снова.


CPallini

если strcmp(passwordone,passwordtwo) ==0
Недопустимо: круглые фигурные скобки обязательны в если заявление.

Nelek

Я не был уверен (долгое время без компиляции C / C++). Я сейчас же все исправлю. Спасибо Карло

Member 13933893

Привет CPallini и Nelek.

Спасибо за ваши ценные предложения .

Я пишу эту программу как Новичок и высоко ценю все ваши вклады .

После того как я прошел через ваше предложение и реализовал то же самое , я могу написать пароль только тогда, когда они совпадают. Однако я не в состоянии понять концепцию цикла while . Если бы кто-нибудь из вас, ребята, мог помочь мне понять то же самое и дать мне небольшой пример реализации, это было бы здорово.

Вот что у меня есть до сих пор
#включить <stdio.h>
#include <stdlib.h> /* Для функции exit() */
тап_п()
{
имя пользователя char[1000];
char passwordone[1000];
char passwordtwo[1000];

Файл *fptr;

fptr = fopen("program.txt", "w");
if(fptr == NULL)
{
printf("ошибка!");
выход(1);
}

printf("введите свое имя пользователя\n");
получает(имя пользователя);

fprintf(fptr,"%s", имя пользователя);

printf("введите свой пароль\n");
получает(passwordone);

printf("введите свой пароль еще раз\n");
получает(passwordtwo);


if (strcmp(passwordone,passwordtwo)==0)
{
printf("пароли совпадают");
fprintf(fptr,"%s", passwordone);
}
еще
{
printf("Пароли не совпадают");
}
fclose(fptr);

возвращает 0;
}

CPallini

Пожалуйста, ознакомьтесь с моим обновленным решением.

Member 13933893

Привет CPallini,

Спасибо вам за то же самое. Однако у меня есть несколько сомнений.

В то время как я компилирую то же самое , я получаю предупреждение о том, что "gets" является опасной функцией и переключать ее на "fgets" везде, где используется gets.

Однако при этом и перекомпиляции я теперь получаю дополнительные ошибки .

Я не уверен, что аргументов, которые являются только переданной переменной, достаточно.

Какие еще параметры нужно передать дальше ?

Ссылка на ошибку :
test.c:22:3: ошибка: слишком мало аргументов для функции ‘fgets’
fgets(имя пользователя);
^~~~~
В файле, включенном из test.c:1:0:
/usr/include/stdio.h:564:14: Примечание: объявлено здесь
модификатор extern char *в чем fgets (char*, так Ключевое слово__restrict __ы, инт __Н файл *ключевое слово__restrict __трансляций)
^~~~~
test.c:29:5: error: слишком мало аргументов для функции ‘fgets’
fgets(passwordone);
^~~~~
В файле, включенном из test.c:1:0:
/usr/include/stdio.h:564:14: Примечание: объявлено здесь
модификатор extern char *в чем fgets (char*, так Ключевое слово__restrict __ы, инт __Н файл *ключевое слово__restrict __трансляций)



CPallini

gets и fgets имеют разные сигнатуры. Вы должны использовать
fgets(имя пользователя, 1000, stdin);
вы также должны удалить из строки завершающий символ новой строки (если таковой имеется).

Рейтинг:
0

Jochen Arndt

Вы пробовали его скомпилировать?

Вы получите некоторое сообщение об ошибке, указывающее, какие строки вы должны проверить:

if strcmp(passwordone,passwordtwo ==0)
Это явно недопустимый синтаксис C/C++. Так и должно быть
if (strcmp(passwordone,passwordtwo) == 0)

Для этой строки компилятор жалуется на password время необъявленной:
fprintf(fptr,"%s", password);
Должно быть очевидно, как это исправить.

Компилятор также может пожаловаться на отсутствие объявления для strcmp() (зависит от используемого компилятора). Включать строку.ч который содержит декларацию.

Наконец, никогда не используйте gets() функция. Воспользуйся fgets() вместо этого (но обратите внимание, что это не приведет к удалению новой строки из входных данных, так что вам придется делать это с помощью кода).

Чтобы выполнить требование записи в файл только тогда, когда пароли совпадают, выполните запись в выходной файл, включая открытие и закрытие в соответствующем окне. if блок в конце вашей программы.


Nelek

вы забыли часть "не выходить, когда не совпадают" :)
Полагаю, мы писали одновременно

Jochen Arndt

- О, да. Я был сосредоточен на всех этих ошибках.
Но это можно сделать с помощью простого цикла while.