Probleme mit Zeichen-Eingabe mit scanf()
Ich versuche, die input-Charakter in einer verknüpften Liste, wo die Zeichen 'A','a','G','g','T','t','C' oder 'c'.
Ich bin noch nicht vertraut mit C, und ich weiß, ich habe etwas geschraubt bis hier:
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 initialisiert wird mit einem junk-Wert, in diesem Fall "q".
Eingabe 'x' beendet die Schleife, Eingabe einer akzeptablen Wert nennt AddToSequence () und den inakzeptablen Wert bekommt eine Warnung.
Aus irgendeinem Grund, egal, was der Wert ist in newChar, springt er in das andere. Es wird auch geradewegs vorbei an der scanf ohne zu warten, für die Einreise aus der Benutzer-und zwei-Schleifen jedes mal, wenn Sie es Schleifen. Kann mir jemand sagen, wohin ich gehe falsch gemacht?
Volle Programm:
#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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie sich nicht mit der newline. Die
%c
Planer nicht skip blanks. Versuchen:Oder vielleicht fügen Sie einen expliziten test.
Eine weitere kleine Haken. Scanf scheint noch immer zu greifen Zeichen einer Schleife spät: die Eingabe von '1' (Menü), A '(für die Eingabe), 'B' (fail) 'C' (für die Eingabe) scheint zu scheitern, nachdem die Eingabe 'A', die Arbeit nach der Eingabe von 'B' und scheitern immer wieder nach Eingabe von 'C', wobei 'A' und 'C' übergeben soll.
Unsicher 😕 Sie sind mit
" %c"
, richtig ?Wie sagte ich vor,
" %c"
ist robuster.Ihre
AddToSequence
sieht verbockt. Zum Beispiel, ich glaube nicht, dass Sie sollten Klammern ({
) auf, während; Sie brauchen wirklich nur zu tunloc=loc->point;
es. und weisen loc->Punkt außerhalb in der Schleife.InformationsquelleAutor cnicutar
hinzufügen Raum, um
"%c"
zu fangen, das newline-Zeichen. der Raum charcter wird verwendet, um zu fangen, Leerzeichen, Tabellierung, newlinedie Rechte ist nach und nicht vor, weil Sie die Eingabe der charchter und dann die neue Zeile
Ich denke, man sollte es vor dem %c. Es wird Essen die newline Wann immer es nötig ist (zum Beispiel eine frühere
%d
brechen Sie den code in dieser Antwort). Auf der anderen Seite, wenn Sie verwenden Sie "%c" können Sie nicht konstruieren ein Szenario, um Sie zu brechen.Tat. Es hat geklappt!
Einen Haken, scheint Es nun zu füllen der Liste komischerweise. 8 Einträge angezeigt, gehen in Ordnung (AAAACCCC), aber der Display () - Funktion sagt mir die Liste enthält nur die einzelnen Zeichen A, und der Prozentsatz-Funktion sagt mir jeder, dass A, G, T und C, alle nehmen bis 12,5% der Liste jeder (unmöglich). Das war in Ordnung arbeiten früher, so habe ich keine Ahnung, was Los jetzt.
InformationsquelleAutor MOHAMED
Verlassen Sie die
'\n'
aufstdin
:Oder, da Sie bereits mit
scanf()
Sie sagen können, scanf selbst zu kümmern, neue-Zeile-Zeichen:Sogar noch besser, Sie können es öffnen, indem Sie ein Leerzeichen nach dem format specificer:
Nur im Fall, dass der Benutzer etwas tun will, wie:
2<tab key><enter key>
Unabhängig davon, wie Sie damit umgehen, der Punkt ist, dass Sie brauchen, um zu konsumieren, das newline-Zeichen.
InformationsquelleAutor Mike
Verwenden
Dies ist eine benutzerdefinierte Funktion, dass wird ein Zeichen von der Tastatur ein, Echos auf den Bildschirm.
InformationsquelleAutor Gopal Daingla