Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ปัญหากับ scanf() เมื่อมี fgets()/gets()/scanf() ต่อจากใน C


ปัญหาระบุว่าสิ่งที่จะทำงานหรือผลลัพธ์หาก scanf ตามด้วย fgets()/gets()/scanf()

fgets()/gets() ตามด้วย scanf()

ตัวอย่าง

#include<stdio.h>
int main() {
   int x;
   char str[100];
   scanf("%d", &x);
   fgets(str, 100, stdin);
   printf("x = %d, str = %s", x, str);
   return 0;
}

ผลลัพธ์

Input:
30
String
Output:
x = 30, str =

คำอธิบาย

fgets() และ gets() ใช้ในการรับอินพุตสตริงจากผู้ใช้ในขณะทำงาน ฉันโค้ดด้านบนเมื่อเราเรียกใช้ ป้อนค่าจำนวนเต็ม จากนั้นมันจะไม่ใช้ค่าสตริงเพราะเมื่อเราให้ขึ้นบรรทัดใหม่หลังค่าจำนวนเต็ม จากนั้น fgets() หรือ gets() จะนำบรรทัดใหม่เป็นอินพุตแทนอินพุตที่ต้องการซึ่งก็คือ "สตริง" .

scanf() ตามด้วย scanf()

หากต้องการซ้ำ scanf() ตามด้วย scanf() เราสามารถใช้ลูปได้

ตัวอย่าง

#include<stdio.h>
int main() {
   int a;
   printf("enter q to quit");
   do {
      printf("\nenter a character and q to exit");
      scanf("%c", &a);
      printf("%c\n", a);
   }while (a != ‘q’);
   return 0;
}

ผลลัพธ์

Input:
abq
Output:
enter q to quit
enter a character and q to exita
a
enter a character and q to exit
enter a character and q to exitb
b
enter a character and q to exit
enter a character and q to exitq

คำอธิบาย

ที่นี่เราสามารถเห็นบรรทัดพิเศษ 'ป้อนอักขระและ q เพื่อออก' หลังจากขึ้นบรรทัดใหม่ นี่เป็นเพราะทุกครั้งที่ scanf() ทิ้งอักขระขึ้นบรรทัดใหม่ไว้ในบัฟเฟอร์ซึ่งเขากำลังอ่านต่อไป scanf() ตามด้วยมัน . เพื่อแก้ปัญหานี้ด้วยการใช้ '\n' กับตัวระบุประเภทใน scanf() เช่น scanf(“%c\n”); หรืออีกทางหนึ่งคือ เราสามารถใช้ extra getchar() หรือ scanf() เพื่ออ่านบรรทัดใหม่เพิ่มเติม