При вводе массива символов вам не нужно указывать &uname
, Почему для scanf не нужен амперсанд для строк, а также отлично работает в printf (на C)?
Исправьте это так:
scanf("%s",uname);
Остальные исправления:
if(list != NULL) //check if list have content
{
while(fgets(storage,sizeof(storage),list) != NULL) //if list have content, get it line by line and compare it to the uname.
{
if (*storage == '\n')
continue;
sscanf(storage, "%[^\n]", storage);
printf("storage:%s\n",storage); // for debug, checks the current value of storage
printf("uname:%s\n",uname); //for debug, checks the value of uname
if(!strcmp(storage, uname)) //this if block is being ignored, even when the storage and uname match, the block does not execute.
{
printf("Login Success!\n");
}
}
}
Кроме того, вы можете просто использовать fscanf()
вместо fgets
, но это довольно плохая идея, прочитайтепервый ответ в Проблемы с чтением строки с использованием fscanf ()
Итак, сначала вы fgets()
сохраните значение в storage
.
Как указано в manpage :
fgets () считывает из потока не более одного размера символа и сохраняет их в буфере, указанномs.Чтение останавливается после EOF или новой строки.Если читается новая строка, она сохраняется в буфере.Завершающий нулевой байт (aq \ 0aq) сохраняется после последнего символа в буфере.
При кратком чтении остановится, если встретится новая строка, но он также будет сохранен.
Итак "username" != "username\n"
.Вот почему мы sscanf()
снова переводим строку в ту же строку для чтения только до \n
.
Также для сравнения массивов символов необходимо использовать strcmp()
.==
будет работать, если вы сравниваете char *
.