Rick York
Если вы сопоставляете имена пользователей и пароли, то вы не хотите использовать strncmp. Вы должны убедиться, что они точно совпадают. Вы можете обнаружить, что при чтении входных данных в буфере остаются новые символы строки или возвращается каретка. Если это так, я нахожу, что это часто бывает, то напишите себе функцию, чтобы удалить их. Вот один из способов, которым вы можете это сделать, который не является особенно высокой производительностью :
void RemoveNewLines( char * buffer )
{
char * ptr;
ptr = strchr( buffer, '\n' );
if( ptr )
* ptr = 0;
ptr = strchr( buffer, '\r' ); // in case you see carriage returns also
if( ptr )
* ptr = 0;
}
Затем вы можете изменить свой код, чтобы он выглядел следующим образом :
#define STRING_SIZE 49
int main()
{
char instr[STRING_SIZE+1];
char string[STRING_SIZE+1];
FILE * fr = NULL;
int flag = 0;
fr = fopen("fiile.csv","r");
if( fr == NULL )
{
printf( "Unable to open file\n" );
return 1;
}
printf("Enter your name: ");
fgets( instr, STRING_SIZE, stdin);
RemoveNewLines( instr );
while( fgets( string, STRING_SIZE, fr ) )
{
RemoveNewLines( string );
if( strcmp( instr, string ) == 0 )
{
printf("Here is your details");
printf("%s", string);
flag = 1;
break;
}
}
fclose(fr);
if( flag != 1 )
{
printf("Access denied.\n");
return -1;
}
return 0;
}
Я думаю, что вижу в этом потенциальную проблему. Если ваш файл действительно является файлом .CSV и у вас есть другие элементы в той же строке (детали), то это никогда не будет совпадать. Однако вы не можете просто сделать ограниченный матч. Два имени "Джон" и "Джонатан" могли бы совпадать, если бы это делалось на ограниченной основе, так что это проблема.
Чтобы обойти эту проблему, предположив, что за именем пользователя в файле следует запятая, вы можете попробовать добавить запятую к записи пользователя. Тогда это заставит их совпадать с запятой, которая должна обеспечить точное совпадение имен пользователей. Эта ревизия может выглядеть так :
#define STRING_SIZE 49
int main()
{
char instr[STRING_SIZE+1];
char string[STRING_SIZE+1];
FILE * fr = NULL;
int flag = 0;
size_t length = 0;
fr = fopen("fiile.csv","r");
if( fr == NULL )
{
printf( "Unable to open file\n" );
return 1;
}
printf("Enter your name: ");
fgets( instr, STRING_SIZE, stdin);
RemoveNewLines( instr );
strcat( instr, "," ); // append a comma to the user's entry
length = strlen( instr );
while( fgets( string, STRING_SIZE, fr ) )
{
RemoveNewLines( string );
if( strncmp( instr, string, length ) == 0 )
{
flag = 1;
break; // no need to read any more, unless you want to
}
}
fclose(fr); // close the file - some OS don't like it if it isn't
if( flag == 1 ) // I prefer positive logic
{
printf( "Your details :" );
printf( "'%s'\n", string );
return 0;
}
printf("Access denied.\n");
return -1;
}
С добавлением запятой ограниченное сравнение строк имеет смысл, предполагая, что имя следует за запятой в файле.
ibilalkayy
Эй, Рик, я использовал 2-й код, но проблема, с которой я столкнулся, заключается в том, что он принимает только первое слово, которое имеет запятую в конце. В файле есть много слов с запятыми в конце, но он принимает первое слово. Например, если бы я дал возможность ввести номер вашей идентификационной карты, который не является первым словом. Это может быть 2-е или 3-е слово в файле, тогда как я буду с ним обращаться?
Rick York
Чтобы сопоставить другие слова, вам придется отделить слова в каждой строке от файла. Обычно я использую для этого strtok, и вашим разделителем будет запятая. Он делает довольно глупый синтаксический анализ и будет ловить запятые в строках вроде этого, так что вам придется следить за этим. Это отдельный вопрос от того, что вы изначально задали, поэтому, если вы застряли, вам, вероятно, следует опубликовать еще один вопрос об этой части.