STRCMP werkt niet

Ik weet dat dit misschien een volledig newbie-vraag is (ik heb C niet lang niet lang geraakt), maar kan iemand me vertellen waarom dit niet werkt?

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
if (strcmp(buffer, "exit") == 0)
    return 0;

Als ik “EXIT” invoer, voert het niet in de IF, dan, heeft het met de lengte van “buffer”?

Alle suggesties?


Antwoord 1, Autoriteit 100%

U wilt dit doen:

strcmp(buffer, "exit\n")

Dat wil zeggen, wanneer u uw string invoert en druk op “ENTER”, wordt de nieuwlijn een deel van buffer.

Gebruik afwisselend StrnCMP (), die alleen N-tekens van de string

vergelijkt


Antwoord 2, Autoriteit 35%

Fgets () retourneert de string “EXIT \ N” – In tegenstelling tot GET (), behoudt deze newlines.


Antwoord 3, Autoriteit 19%

Zoals anderen hebben gezegd, vergelijken met "exit"faalt omdat fgets()de nieuwlijn in de buffer bevatte. Een van zijn garanties is dat de buffer eindigt met een nieuwe lijn, tenzij de ingevoerde regel te lang is voor de buffer, in welk geval het niet eindigt met een nieuwe lijn. fgets()garanderen ook dat de buffer NUL is beëindigd, dus u hoeft niet nul 256 bytes maar laat het alleen fgets()gebruiken 255 om die garantie te krijgen.

Het eenvoudige antwoord op het vergelijken van exact "exit\n"Vereist dat de gebruiker niet per ongeluk witruimte voegt vóór of na het woord. Dat kan niet uitmaken of u de gebruiker wilt forceren om voorzichtig te zijn met de -uitgang -opdracht, maar kan in het algemeen een bron van gebruikersgerecht zijn.

Als u strncmp()gebruikt, kunnen "exited", "exit42"en meer mogelijk overeenkomen met waar u ze misschien niet wilt hebben. Dat kan tegen je werken, vooral als sommige geldige commando’s voorvoegsels zijn van andere geldige commando’s.

In het algemeen is het vaak een goed idee om I/O, tokenisatie, parsing en actie in hun eigen fasen te scheiden.


Antwoord 4, autoriteit 4%

Eens met Dave. Misschien wilt u in plaats daarvan ook strncmp() gebruiken. Dan kun je een lengte instellen voor de vergelijking.

http://www.cplusplus.com/reference/clibrary/cstdio/ fgets/

http://www.cplusplus.com/reference/clibrary/cstring/ strncmp/


Antwoord 5

Ik raad je aan om de \n van het einde van de tekenreeks te verwijderen, op deze manier.

char buf[256];
int len;
/* verkrijg de string, zorg ervoor dat er ruimte is voor een null byte */
if ( fgets(buf,sizeof(buf) - 1) == EOF)
{
 printf("fout\n");
 uitgang(1);
}
/* absoluut altijd null-terminate, de gemakkelijke manier */
buf[sizeof(buf) - 1] = '\0';
/* bereken de lengte en kap de \n eventueel af */
len = strlen(buf);
while ( len > 0 && buf[len - 1] == '\n' )
{
 buf[len - 1] = '\0';
 --len;
}

Op die manier hoef je, als je de ingevoerde string moet vergelijken met verschillende constanten, de \n niet bij allemaal op te tellen.

Other episodes