Cómo obtener la segunda cadena de la entrada

#include  #include  int main(void) { char command[256]; char *token; const char s[2] = " "; fprintf(stdout, "$ Please enter a command \n"); fflush( stdout ); fgets ( command, 256, stdin ); token = strtok(command, s); if (strcmp(token, "loaddungeon") == 0){ fprintf(stdout, "$ loaded successfully \n"); fflush( stdout ); } } 

Estoy tratando de usar strtok para obtener la segunda cadena de la entrada. Por ejemplo, si la entrada es ” loaddungeon dfile.txt “, lo que quiero obtener es el ” dfile.txt “. Mi función es capaz de obtener la cadena ” loaddungeon “. Pero no tengo idea de cómo obtener la segunda cadena ” dfile.txt “. ¿Alguien puede decirme cómo hacerlo?

(Tenga en cuenta que la entrada es siempre ” loaddungeon dfile.txt “.)

Para leer la segunda cadena, debe pasar NULL a strtok() . Tenga en cuenta que fgets() retiene el carácter de nueva línea de la línea de entrada, por lo que debe cambiar su definición de delimitador de char s[2] = " "; a char s[] = " \r\n"; , o char s* = " \r\n" . De esta manera, el segundo token no incluirá ningún carácter de nueva línea. También tenga en cuenta que strtok() devuelve un puntero NULL si no se encuentra ningún token, por lo que el código que se encuentra a continuación lo prueba antes de imprimir los tokens de lectura.

Pero, como dice que solo hay dos cadenas, consideraría simplemente usar sscanf() para esto. Usando el especificador de conversión %s , sscanf() leerá los caracteres en una cadena hasta que se encuentre un carácter de espacio en blanco, pero no incluirá este carácter de espacio en blanco en la cadena. Cuando utiliza el especificador %s en una función de tipo scanf() , debe especificar un ancho de campo máximo para evitar el desbordamiento del búfer. Este ancho máximo debe ser uno menos que el tamaño del búfer para dejar espacio para el terminador de cadena '\0' , 255 en este caso. La función sscanf() devuelve el número de asignaciones realizadas, que en este caso deberían ser 2 . El enfoque sscanf() se muestra a continuación (comentado) verifica este valor de retorno antes de imprimir las cadenas.

 #include  #include  #include  #define BUFFER_MAX 256 int main(void) { char command[BUFFER_MAX]; char *token1 = NULL; char *token2 = NULL; const char *s = " \r\n"; fprintf(stdout, "$ Please enter a command \n"); fflush( stdout ); fgets ( command, BUFFER_MAX, stdin ); token1 = strtok(command, s); token2 = strtok(NULL, s); if (token1 && token2 && strcmp(token1, "loaddungeon") == 0) { fprintf(stdout, "$ loaded successfully: %s\n", token2); fflush( stdout ); } /* or instead do this */ /* char word1[BUFFER_MAX], word2[BUFFER_MAX]; if (sscanf(command, "%255s %255s", word1, word2) == 2) { if (strcmp(word1, "loaddungeon") == 0){ fprintf(stdout, "$ loaded successfully: %s\n", word2); fflush( stdout ); } } */ return 0; } 

Cada llamada a strtok devolverá un puntero al último token encontrado en la cadena dada (o nulo si no queda ninguno). Para recuperar el segundo token con espacio como delimitador, debe llamar a strtok por segunda vez.

 int main() { char command[256]; char *token1 = NULL; char *token2 = NULL; const char s[2] = " "; fprintf(stdout, "$ Please enter a command \n"); fflush(stdout); fgets(command, 256, stdin); token1 = strtok(command, s); // now points to first word if (NULL != token1) { token2 = strtok(NULL, s); // now points to second word } if (NULL != token2) { if (strcmp(token2, "loaddungeon") == 0){ fprintf(stdout, "$ loaded successfully \n"); fflush(stdout); } } }