gets() function in C programming
i hav a problem with the gets() function in my program code.please give me ideas.
void function3() { char input[50]; //The entered string int choice,i,flag=0,count=0,count1=0,count2=0,count3=0; printf("Enter your sentence\n"); gets(input); when i run the program,it doesnt allow one to enter the sentence,it skips to the next line.Here is the entire program. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #define BUFFERSIZE 128 #define FALSE 0 #define TRUE 1 #define MAXIMUM 200 #define MAX 50 void function1(); void function2(); void function3(); void function4(); main() { time_t start, stop; struct tm *now,*end; char buf1[BUFFERSIZE]; char buf2[BUFFERSIZE]; char *starttime_format ="Program start time was %I:%M:%S %p.\n"; char *stoptime_format ="Program end time was %I:%M:%S %p.\n"; double elapsetime; int choice,exit=0,count=0,count1=0,count2=0,count3=0; time(&start); now = localtime(&start); strftime(buf1,sizeof buf1,starttime_format,now); do { printf("==========================\n"); printf("1-Program 1:Prime numbers\n"); printf("2-Program 2:Word rotation\n"); printf("3-Program 3:Case conversion\n"); printf("4-Program 4:Print calendar\n"); printf("5-Exit\n"); printf("==========================\n"); printf("Enter your choice:\n"); scanf("%d",&choice); switch(choice) { case 1: count++; function1(); break; case 2:count1++; function2(); break; case 3:count2++; function3(); break; case 4:count3++; function4(); break; case 5: exit=1; break; default: printf("Invalid choice\n"); break; } if(exit==1) break; printf("\n\n"); }while(exit==0); printf("\n\n"); time(&stop); end= localtime(&stop); strftime(buf2,sizeof buf2,stoptime_format,end); puts(buf1); puts(buf2); elapsetime=difftime(stop,start); printf("Program run time was %.2f\n",elapsetime); printf("Selection 1 was used %d time(s)\n",count); printf("Selection 2 was used %d time(s)\n",count1); printf("Selection 3 was used %d time(s)\n",count2); printf("Selection 4 was used %d time(s)\n",count3); return 0; } void function1() { int number,divisor, prime; int limit=10; for(number=2;number<=200;number++) { prime=TRUE; for(divisor=2;divisor<=10;divisor++) if(((number%divisor)==0) && number!=divisor) prime=FALSE; if (prime && number!=1) { while(number>=limit) { printf("\n"); limit+=10; } printf(" %d",number); } } printf("\n"); } void function2() { char name[50],hold,hold2; int firstchar=0,lastchar,number,inputlength,n,loop; printf("Enter words less than 50 characters\n"); scanf("%s", &name); do { inputlength = strlen(name); printf("Enter a value less than %d\n",inputlength); scanf("%d", &number); }while(number > inputlength); lastchar=inputlength-1; for(loop=1; loop<=number; loop++) { n=1; hold=name[firstchar]; name[firstchar]=name[lastchar]; name[lastchar]=name[lastchar-1]; while(n<=lastchar-1) { hold2=name[n]; name[n]=hold; n++; hold=name[n]; name[n]=hold2; n++; } } printf("output=%s\n",name); printf("\n"); } void function3() { char input[50]; //The entered string int choice,i,flag=0,count=0,count1=0,count2=0,count3=0; printf("Enter your sentence\n"); gets(input); do { printf("How do you want this text converted?\n"); printf("1.To upper case\n"); printf("2.To lower case\n"); printf("3.Sentence case\n"); printf("4.Toggle case\n"); printf("5.Quit\n"); printf("----------------\n"); printf("Enter your choice\n"); scanf("%d",&choice); switch(choice) { case 1: count++; for (i = 0; input[i] != '\0'; i++) { strupr(input); } printf("To uppercase:-\n"); printf("%s\n",input); break; case 2: count1++; for (i = 0; input[i] != '\0'; i++) { input[i]=tolower(input[i]); } printf("To lowercase:-\n"); printf("%s\n",input); break; case 3: count2++; printf("To sentence case:-\n"); printf("%s\n",input); break; case 4: count3++; for (i = 0; input[i] != '\0'; i++) { if(islower(input[i])) input[i]=toupper(input[i]); else input[i]=tolower(input[i]); } printf("To toggled case:-\n"); printf("%s\n",input); break; case 5: flag=1; break; default:printf("Wrong option\n"); break; } if(flag==1) break; printf("\n\n"); }while(flag==0); } void function4() { void printMonth(int year, int month); int year,month; // The user enters year and month printf("Enter which year: "); scanf("%d",&year); printf("Enter month in number between 1 and 12: "); scanf("%d",&month); // Print calendar for the month of the year printf("\n\n"); printMonth(year, month); printf("\n\n"); } // Print the calendar for a month in a year void printMonth(int year, int month) { int getStartDay(int year, int month); int getNumOfDaysInMonth(int year, int month); void printMonthTitle(int year, int month); void printMonthBody(int startDay, int numOfDaysInMonth); // Get start day of the week for the first date in the month int startDay,numOfDaysInMonth; startDay= getStartDay(year, month); // Get number of days in the month numOfDaysInMonth= getNumOfDaysInMonth(year, month); // Print calendar headings printMonthTitle(year, month); // Print body of the calendar printMonthBody(startDay, numOfDaysInMonth); } // Get the start day of the first day in of the month int getStartDay(int year, int month) { int getTotalNumOfDays(int year, int month); // Get total number of days since 1/1/1800 int startDay1800 = 3; int totalNumOfDays; totalNumOfDays= getTotalNumOfDays(year, month); return (int)((totalNumOfDays + startDay1800) % 7); } int getTotalNumOfDays(int year, int month) { int getNumOfDaysInMonth(int year, int month); int isLeapYear(int year); int total = 0; int i; for (i = 1800; i <year; i++) if (isLeapYear(i)==1) total = total + 366; else total = total + 365; for (i = 1; i <month; i++) total = total + getNumOfDaysInMonth(year, i); return total; } int getNumOfDaysInMonth(int year, int month) { int isLeapYear(int year); if (month == 1 || month==3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) return 31; if (month == 4 || month == 6 || month == 9 || month == 11) return 30; if (month == 2) if (isLeapYear(year)==1) return 29; else return 28; return 0; } int isLeapYear(int year) { if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) return 1; return 0; } void printMonthBody(int startDay, int numOfDaysInMonth) { int i = 0; for (i = 0; i < startDay; i++) printf(" "); for (i = 1; i <= numOfDaysInMonth; i++) { if (i < 10) printf("\t%d",i); else printf("\t%d",i); if ((i + startDay) % 7 == 0) printf("\n"); } printf("\n"); } void printMonthTitle(int year, int month) { void getMonthName(int month); printf(" "); getMonthName(month); printf("\t%d\n",year); printf(" --------------------------------------------------------\n"); printf(" \tSun\tMon\tTue\tWed\tThu\tFri\tSat\n"); } void getMonthName(int month) { char monthName; switch (month) { case 1: monthName=printf("January"); break; case 2: monthName=printf("February"); break; case 3: monthName=printf("March"); break; case 4: monthName=printf("April"); break; case 5: monthName=printf("May"); break; case 6: monthName=printf("June"); break; case 7: monthName=printf("July"); break; case 8: monthName=printf("August"); break; case 9: monthName=printf("September"); break; case 10: monthName=printf("October"); break; case 11: monthName=printf("November"); break; case 12: monthName=printf("December"); break; default: printf("Invalid Month name\n"); break; } } |
As far as I know, gets() returns a string up until the first whitespace character doesn't it?
|
Moved: This thread is more suitable in Programming and has been moved accordingly to help your thread/question get the exposure it deserves.
|
Hi,
it's caused by input buffer and scanf function, which doesn't take newline char form buffer. So you need to remove all remaining chars. You can do it simply like this: Code:
printf("==========================\n"); Never use gets function, because it's security risc:cry: . Use fgets instead. Code:
void function3() |
I'm not sure what to say. If you post a program of this magnitude, it would be much appreciated if you improved readability (i.e. indentation and stuff).
Your problem is not with the gets(). It is with your use of scanf. Your code reads Code:
scanf("%d",&choice); Then, when you call gets(), it processes all remaining data (including the newline you already entered), without allowing you to enter new data. There are a few ways to work around this. I'm not sure which one will work for you / which one you'll prefer.
Groetjes, Kees-Jan |
hi,
gets() returns string up untill it finds "\n" , white spaces are allowed. before scanning the test you flush the input buffer. say using fflush(stdin) this should work. Regards Mehul |
if you want to read a string including space then use following scanf option,
scanf("%[^\n]s",str); this will read the string including space Regards Mehul |
fflush(stdin) isn't really a recommended way to flush the input buffer since fflush() has undefined results on non-output streams (meaning it's safe for, say, stdout but not stdin.) It might work with one compiler, but do something entirely different on another.
But as long as you're going to use gets() anyway, I guess you're probably not too concerned about portability ;) gets() is very dangerous to use. In fact, gcc even tells you that it is: Code:
itsme@itsme:~/C$ cat gets.c |
All times are GMT -5. The time now is 06:59 PM. |