Intereting Posts
printf без \ n не отображает текст при размещении до этого времени (1) Объявить функцию void в C? Как определить, имеет ли сырой пакет 802.11 FCS (4 байта) в драйвере фильтра NDIS 6? связь между двумя дочерними процессами с трубами Почему структуры не допускаются в выражениях равенства в C? Чтение правильных данных из NFC-запястья с NXP Mifare Ultralight в C Отрицательный scanset в fscanf и EOF Изменение данных файла .bin в C Подождите, пока нажмите enter в C внутри цикла while? медленно разреженный матричный векторный продукт (CSR) с использованием открытой mp Поиск самого большого и второго по величине числа Какой тип данных или структура данных выбрать для расчета факториала 100? gettimeofday clock_gettime решение для генерации уникального номера как программа работает в памяти и как память обрабатывается операционной системой Неопределенное поведение “char foo = 255”, если char подписан?

Проблемы с вводом символов с помощью scanf ()

Я пытаюсь ввести символ в связанный список, где символ может быть «A», «a», «G», «g», «T», «t», «C» или «c».

Я еще не знаком с C, и я знаю, что я что-то прикрутил здесь:

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 инициализируется значением нежелательной почты, в данном случае «q».

Ввод «x» завершает цикл, вводя любое допустимое значение вызывает AddToSequence (), и любое недопустимое значение получает предупреждение.

По какой-то причине, независимо от того, какое значение имеет значение newChar, он будет переходить на другое. Он также будет прыгать прямо мимо scanf, не дожидаясь входа от пользователя и делать две петли каждый раз, когда он петли. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Полная программа:

 #include #include /*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 ; } в #include #include /*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 ; } в #include #include /*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 ; } в #include #include /*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 ; } 

Вы не обрабатываете новую строку. Спецификатор %c не пропускает пробелы. Пытаться:

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

Или, может быть, добавить явный тест.

 scanf(...); if (newChar == '\n') continue; 

добавьте пробел в "%c" чтобы поймать символ новой строки. пространственный символ используется для захвата пробелов, табуляции, новой строки

 scanf("%c ",&newChar); 

Вы оставляете '\n' на stdin :

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

Или, поскольку вы уже используете scanf() вы можете сказать scanf, чтобы он заботился о символе новой строки:

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

Еще лучше вы можете оставить его открытым, добавив пробел после спецификатора формата:

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

На всякий случай пользователь хочет сделать что-то вроде: 2

Независимо от того, как вы справляетесь с этим, важно, чтобы вы потребляли символ новой строки.

использование

 newChar=getche(); 

Это нестандартная функция, которая получает символ с клавиатуры, перекликается с экраном.