Как сказано в заголовке, я пытался создать систему регистрации, но по какой-то причине она перезаписывала массив, который должен был быть defaultuser[0] = «12291955», он становится тем, что я ввел, за исключением того, что я хотел, чтобы он перешел в defaultuser[3 ] (обозначается x = 3). По сути, система регистрации должна добавить четвертого пользователя. (Ниже приведен заголовочный файл моего файла main.c)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void loginsystem(){
char defaultuser[][100] = {"12291995", "12221999", "12241344"};
char defaultpass[][100] = {"test1", "test2", "test3"};
int i = 0, indicator = 1, x = 3;
char userinput[20], passinput[20], choicest[20], prog[20];
const char* choicecmp;
system("cls");
printf("\nSystem");
printf("\nWould you like to create an account or log into an existing account? (Type Signup or Login) ");
scanf(" %[^\n]s", choicest);
printf("%d", x); //x=3
choicecmp = strlwr(choicest);
if (strcmp(choicecmp, "signup")==0 || strcmp(choicecmp, "sign up") == 0 )
{
//system("cls");
printf("\nEnter your ID Number: ");
scanf(" %s", defaultuser[x]);
printf("\nEnter your password: ");
scanf(" %s", defaultpass[x]);
getch();
choicecmp = "login";
x++;
printf("%d", x); //x becomes 1 for some reason
getch();
}
if (strcmp(choicecmp, "login")==0 || strcmp(choicecmp, "log in") == 0 ){
do{
system("cls");
printf("\nPlease login!");
printf("\n\nUsername (ID Number): ");
scanf(" %s", &userinput);
printf("\nPassword: ");
do{
passinput[i] = getch();
if (passinput[i] != '\r')
printf("*");
i++;
}while(passinput[i-1] != '\r');
passinput[i-1] = '\0';
for(int i = 0; i < x; i++){
if (strcmp(userinput, defaultuser[i]) == 0 && strcmp(passinput, defaultpass[i]) == 0)
{
system("cls");
indicator = 0;
printf("\nWelcome back User");
}}
return ;
}
Я попробовал отладить код и обнаружил, что int x = 3 стал x=0 в системе регистрации и стал 1 после x++.
Подсказка: вы, вероятно, выходите за пределы одного из ваших массивов.
Вы не продемонстрировали проблему, поскольку для этого требуются входные данные, которые можно ввести для воспроизведения проблемы. Пожалуйста предоставьте!
С другой стороны, не существует такого формата scanf, как %[]s. s не является частью формата и вместо этого заставляет код ждать, пока вы введете фактический s в качестве входных данных.
И еще: не пишите большие фрагменты кода сразу. Это значительно усложнит тестирование и отладку. Вместо этого начните с пустой функции main. Сборка с включенными дополнительными предупреждениями, которые рассматриваются как ошибки. Когда она будет собрана правильно, протестируйте программу всеми возможными способами, с правильными и неверными входными данными и т. д. Только затем добавьте больше кода, очень небольшой фрагмент кода, возможно, даже одну или две строки.
Совет: Вместо того, чтобы иметь массив для каждого поля (который я называю «параллельными массивами»), вам может показаться более удобным иметь один массив структуры.
Размер массивов не подлежит изменению в C, то есть его размер определяется при объявлении. В вашем случае вы создаете массивы по 3 элемента в каждом, а это означает, что массив был автоматически объявлен так, чтобы вмещать ровно 3 элемента, поэтому нет места для добавления 4-й пункт.





defaultuser имеет три элемента.
char defaultuser[][100] = {"12291995", "12221999", "12241344"};
Но вы попробуйте записать в четвертый элемент.
int x = 3;
scanf(" %s", defaultuser[x]);
Это неопределенное поведение.
Прежде всего вам нужно минимизировать свой код, чтобы изолировать проблему, создав минимальный воспроизводимый пример . И пока вы это делаете, также убедитесь, что ваш код имеет постоянные отступы и читаем.