Estoy tratando de entrada de un carácter en una lista enlazada, donde el personaje puede ser ‘A’,’a’,’G’,’g’,’T’,’t’,’C’ o ‘c’.

Todavía no estoy familiarizado con C y sé que me he jodido algo aquí:

do{
  printf ("\nEnter a new nucleotide: \n");
  scanf("%c",&newChar);
          /* Checking */
  if(newChar == 'A' ||
     newChar == 'a' || 
     newChar == 'G' || 
     newChar == 'g' || 
     newChar == 'T' || 
     newChar == 't' || 
     newChar == 'C' || 
     newChar == 'c' )
  {
    AddToSequence(newChar);
    size++;
  } else {
    printf ("\nBad Element");
  }
}while(newChar != 'x');

newChar se inicializa con una basura de valor, en este caso, ‘q’.

De entrar en la ‘x’ sale del bucle, de ingresar cualquier valor aceptable de llamadas AddToSequence(), y cualquier valor inaceptable recibe una advertencia.

Por alguna razón, no importa qué valor en newChar, saltará a la otra persona. También saltar directamente pasado el scanf sin esperar a la entrada del usuario y hacer dos nudos, cada vez que se repite. ¿Alguien puede decirme a donde voy mal?

Programa completo:

#include<stdio.h>
#include<stdlib.h>
/*Structure declaration for the node*/
struct node{
char nucleotide;
struct node *point;
}*start;
/* Adds a nucleotide to the chain. Creates a new linked list if no chain exists exists.*/
void AddToSequence(char nucleotide){
struct node *loc, *first;
//Dynamic memory is been allocated for a node
first=(struct node*)malloc(sizeof(struct node));
first->nucleotide=nucleotide;
first->point=NULL;
if(start==NULL){
/*If list is empty*/
start=first;
}else{
/*Element inserted at the end*/
loc=start;
while(loc->point!=NULL){
loc=loc->point;
loc->point=first;
}
}
}
/* Display elements */
void Display(){
struct node *loc;
if(start == NULL){
printf ("\n\nList is empty");
return;
}
loc=start;
printf("\n\nList is : ");
while(loc!=NULL){
printf ("%c", loc->nucleotide);
loc=loc->point;
}
printf ("\n");
}
/* Finds and displays percentage of the chain made up of each nucleotide. */
void Percentage(int size){
struct node *loc;
if(start == NULL){
printf ("\n\nList is empty");
return;
}
loc=start;
printf("\n\nList is : ");
int A = 0, G =0, T =0, C = 0;
double Adouble = 0, Gdouble =0, Tdouble=0, Cdouble=0;
while(loc!=NULL){
if(loc->nucleotide=='A' || 'a'){A++;}
if(loc->nucleotide=='G' || 'g'){G++;}
if(loc->nucleotide=='T' || 't'){T++;}
if(loc->nucleotide=='C' || 'c'){C++;}    
loc=loc->point;   
}
printf ("\n"); 
/* Convert to double for percentages as int loses precision */
Adouble =A;
Gdouble =G;
Tdouble =T;
Cdouble =C; 
Adouble =(Adouble/size)*100;
Gdouble =(Gdouble/size)*100;
Tdouble =(Tdouble/size)*100;
Cdouble =(Cdouble/size)*100; 
printf("\nA: %f", Adouble);
printf("\nG: %f", Gdouble);
printf("\nT: %f", Tdouble);
printf("\nC: %f", Cdouble); 
}
/* There be dragons beyond here */
int main(){
int navigate, size =0;
char newChar = 'q';
do{ /* Menu */
printf("\n 1. Create /Extend Sequence\n");
printf("\n 2. Display Sequence\n");
printf("\n 3. Count \n");
printf("\n 0. Exit \n");
printf("\nPlease select an option (0 to 3)\n");
scanf("%d",&navigate);  
switch (navigate){
case 0: /* Exit */
break;
case 1: /* Add nucleotides */
do{
printf ("\nEnter a new nucleotide: \n");
scanf("%c",&newChar);
/* Some error checking */
if(newChar == 'A' || newChar == 'a' || newChar == 'G' || newChar == 'g' || newChar == 'T' || newChar == 't' || newChar == 'C' || newChar == 'c' ){
AddToSequence(newChar);
size++;
} else {
printf ("\nBad Element");
}
}while(newChar != 'x');
break;
case 2:
Display();
break;
case 3:
Percentage(size);
break;
default:
printf ("\n\nBad choice. Please select another.\n");
}
} while (navigate !=0); 
return 0 ;
}
InformationsquelleAutor PatPat | 2012-12-04

4 Comentarios

  1. 13

    No se manejan de la nueva línea. El %c especificador de no omitir espacios en blanco. Probar:

    scanf(" %c", &newChar);
    /* ^ <-- Makes `scanf` eat the newline. */

    O tal vez agregar un explícito de la prueba.

    scanf(...);
    if (newChar == '\n')
    continue;
    • Ah, gracias! Siempre las pequeñas cosas…
    • Una pequeña pega. Scanf todavía parece ser el acaparamiento de los personajes de un bucle de tarde: de Entrada ‘1’ (menú), ‘Un’ (la entrada), ‘B’ (a fallar), ‘C’ (la entrada) parece fallar después de la entrada ‘A’, de trabajo después de la entrada de la ‘B’ y fallar de nuevo después de la entrada ‘C’ donde ‘a’ y ‘C’ están destinados a pasar.
    • Seguro 😕 Estás usando " %c", ¿verdad ?
    • He intentado «%c » en primer lugar, supongo que el espacio no ir a la primera 😀
    • Como he comentado antes, " %c" es más robusto.
    • Una última pega, que ahora parece ser el llenado de la lista extrañamente. 8 entradas parecen ir en bellas (AAAACCCC), pero la Pantalla de función() me dice que la lista sólo contiene el carácter único de Una y el Porcentaje de la función me está diciendo que a, G, T y C toman el 12.5% de la lista de cada una (imposible). Que estaba trabajando bien antes, así que no tengo idea de lo que está pasando ahora. Los punteros. Maldito ellos.
    • Su AddToSequence parece fallida. Por ejemplo, yo no creo que usted debe tener llaves ({) en que mientras que usted realmente sólo necesita hacer loc=loc->point; allí. y asignar a loc->punto de fuera el bucle.
    • Ah, así que esta? mientras(loc->punto!=NULL) NUEVA LÍNEA de loc=loc->punto; NUEVA LÍNEA /*End while*/ NUEVA LÍNEA loc->punto=primero; ~~~~ Funcionando a la perfección. Muchas gracias!

  2. 5

    agregar espacio "%c" para coger el carácter de nueva línea. el espacio charcter se utiliza para capturar los caracteres de espacio, tabulaciones, newline

    scanf("%c ",&newChar);
    • Otra persona ponga en el espacio antes, la ponen después. ¿Importa?
    • la de la derecha es después y no antes, porque usted está escribiendo la charchter y, a continuación, la nueva línea de
    • Creo que se debe poner antes de la %c. Se va a comer el salto de línea cuando sea necesario (por ejemplo, una anterior %d va a romper el código en esta respuesta). Por otro lado, si utiliza «%c» no se puede construir un escenario para romper.
    • Hizo eso. Funcionó!
    • Uno de los más pega, que ahora parece ser el llenado de la lista extrañamente. 8 entradas parecen ir en bellas (AAAACCCC), pero la Pantalla de función() me dice que la lista sólo contiene el carácter único de Una y el Porcentaje de función está diciendo a mí todos los que a, G, T y C toman el 12.5% de la lista de cada una (imposible). Que estaba trabajando bien antes, así que no tengo idea de lo que está pasando ahora.
  3. 3

    Usted está dejando el '\n' en stdin:

    scanf("%d",&navigate);  
    getchar(); //consume the newline character
    ...
    scanf("%c",&newChar);
    getchar(); //consume the newline character

    O ya que estamos utilizando scanf() puede decir scanf sí mismo para cuidar de el carácter de nueva línea:

    scanf("%d\n", &navigate);
    ....
    scanf("%c\n",&newChar);

    Incluso mejor que usted puede dejar abierto mediante la adición de un espacio después de que el formato de specificer:

    scanf("%d ", &navigate);
    ....
    scanf("%c ",&newChar);

    Sólo en caso de que el usuario quiere hacer algo como: 2<tab key><enter key>

    Independientemente de cómo manejarlo, el punto es que usted necesita para consumir el carácter de nueva línea.

  4. 0

    Uso

    newChar=getche();

    Esto es un no estándar de la función que obtiene un carácter desde el teclado, de los ecos de la pantalla.

Dejar respuesta

Please enter your comment!
Please enter your name here