2015-12-27 19 views
6

मैं काम नहीं कर सकता कि मेरे कोड में क्या समस्या है। यहाँ मेरी कोड है:संरचना में ठीक से fgets का उपयोग कैसे करें?

#include <stdio.h> 
#include <stdlib.h>  

#define N 20 

typedef struct _dog { 
    char dogName[N],ownerName[N]; 
    int dogAge; 
} Dog; 

int main() { 
    //Dynamic array 
    int size; 
    printf("Number of dogs: "); 
    scanf("%d", &size); 
    Dog *dog = (Dog*)malloc(sizeof(Dog)*size); 
    printf("\n"); 
    //Input 
    int i; 
    printf("Please provide the data: [dogName][ownerName][dogAge] :\n"); 
    for(i=0;i<size;i++) { 
     fgets(dog[i].dogName, sizeof(dog[i].dogName), stdin); 
     fgets(dog[i].ownerName, sizeof(dog[i].ownerName), stdin); 
     scanf("%d", &dog[i].dogAge); 
    } 
    //Output 
    printf("\nYou provided the following data:\n"); 
    for(i=0;i<size;i++) { 
     printf("Dog Name: %s\nOwner Name: %s\nDog Age: %d\n", dog[i].dogName, dog[i].ownerName, dog[i].dogAge); 
    } 

    free(dog); 
    return 0; 
} 

काम बहुत आसान है, आप एक डेटाबेस लेकिन कुत्तों और मालिकों दो या अधिक नाम हो सकता है बनाने के लिए है, तो इसलिए मैं fget उपयोग करने के लिए प्रयास करें। लेकिन उत्पादन भयंकर दिखता है: (और पहले कुत्ता नाम हिस्सा आम तौर पर खाली है)

You provided the following data: 
Dog Name: 

Owner Name: Doggy 1 

Dog Age: 0 
Dog Name: Big Dick 

Owner Name: 2 

Dog Age: 0 

मैं this पढ़ा है लेकिन मेरी मदद नहीं की।

इनपुट मैं प्रयोग किया है:

Doggy 1 
Big Dick 
2 
Doggy 2 

यह कुत्ता 2. के बाद

+1

[कृपया इस चर्चा को देखें कि 'malloc()' और 'c' में परिवार का रिटर्न मान क्यों न डालें।] (Http://stackoverflow.com/q/605845/2173917)। –

+0

क्या आप अपना इनपुट दिखा सकते हैं, कृपया? – Downvoter

+0

@ कैड जोड़ा गया! लेकिन ऐसा लगता है कि हमें मुख्य समस्या मिली है। – 2b1c

उत्तर

11

आप अपने पिछले scanf() जो एक वैधfgets() के लिए इनपुट है से एक नई पंक्ति को छोड़ रहे हैं समाप्त हो गया है। बदले

scanf("%d", &size); 

scanf("%d%*c", &size); 

करने के लिए उपयोग करते हैं और प्रेस की वजह से त्यागने अनुगामी न्यू लाइन की कुत्तों की संख्या को दर्ज करने के बाद कुंजी दर्ज करें।

वही लॉप के अंदर dogAge परिवर्तनीय स्कैनिंग के लिए भी जाता है।

संबंधित, C11 मानक, अध्याय §7.21.6.2, fscanf()

सफेद स्थान (नई लाइन वर्णों सहित) से पीछे चल हवाले से अपठित छोड़ दिया जब तक कि एक निर्देश के अनुरूप है। [...]

हां, तो newline ('\n'), सफेद स्थान अनुगामी, इनपुट बफर में अपठित छोड़ दिया है।

+0

तेज़ उत्तर के लिए धन्यवाद।मैंने आकार के हिस्से में कोड जोड़ा है लेकिन ऐसा लगता है कि मुझे अभी भी लूप में मेरे कोड में एक बग मिला है जहां मैं स्कैनफ़ का उपयोग करता हूं। अगर मैं सही समझता हूं कि लूप में स्कैनफ भी एक नई लाइन बनाता है? अद्यतन: मैंने लूप में स्कैनफ़ पर% d% * c जोड़ा है, अब एक आकर्षण की तरह काम करता है। :) क्या स्कैनफ के बाद न्यूलाइन का उपभोग करने का कोई बेहतर तरीका है या मुझे हर समय इसका उपयोग करना है? – 2b1c

+0

@ एम। करवर मेरा जवाब काम करता है। मैंने इसका परीक्षण किया। – Elyasin

+0

@ सौरव घोष मैंने इसे घटा दिया। कृपया कोई अपराध नहीं, लेकिन मैंने इसका परीक्षण किया और यह काम नहीं करता है। क्या यह आपके लिए काम करता है? – Elyasin

3

scanf(...) कॉल के बाद getchar() जोड़ें।

जैसा कि अन्य उत्तरों में उल्लेख किया गया है। scanf प्रारूप के अनुसार मान्यता प्राप्त वर्णों का उपभोग करता है, लेकिन में न्यूलाइन \n छोड़ देता है। getchar के साथ आप इसका उपभोग करते हैं और बाद में stdin से पढ़ते हैं उलझन में नहीं होना चाहिए।

+0

@ एलिसासिन अगर मैं getchar() जोड़ता हूं; दो स्कैनफ के बाद यह भी काम करता है, मदद के लिए धन्यवाद। तुम लोग कमाल के हो! – 2b1c

संबंधित मुद्दे