2010-09-21 10 views
26

मेरे पास यह है लेकिन एक बार यह माना जाता है कि यह ईओएफ तक पहुंच जाता है, यह सिर्फ लूप और स्कैनफ को फिर से दोहराता है।सी में ईओएफ तक स्कैनफ कैसे पढ़ते हैं?

int main(void) 
{ 
     char words[16]; 

     while(scanf("%15s", words) == 1) 
      printf("%s\n", words); 

     return 0; 
} 
+0

आप किस इनपुट का उपयोग कर रहे हैं? क्या आप एक फ़ाइल को 'stdin' पर रीडायरेक्ट कर रहे हैं, या कंसोल पर टाइप कर रहे हैं? यदि उत्तरार्द्ध, आप किस ओएस का उपयोग कर रहे हैं और आप ईओएफ में कैसे टाइप कर रहे हैं? –

उत्तर

0

आप 1 के खिलाफ नहीं EOF के खिलाफ वापसी मान की जाँच करने की जरूरत है।

ध्यान रखें कि आपके उदाहरण में, आप भी दो अलग अलग चर नाम, words और word इस्तेमाल किया, केवल words घोषित कर दिया, और इसकी लंबाई, जो 16 हो के साथ साथ एक NUL चरित्र में पढ़ा 15 वर्ण फिट करने के लिए करना चाहिए घोषित नहीं किया था।

14

प्रयास करें:

while(scanf("%15s", words) != EOF) 

आप प्रारूप स्ट्रिंग में 15 की चौड़ाई को निर्दिष्ट कर रहे हैं के बाद से आप EOF

साथ scanf उत्पादन की तुलना करने की जरूरत है, आप ज्यादा से ज्यादा 15 चार पढ़ेंगे। तो शब्द चार सरणी आकार 16 (15 +1null char) के आकार का होना चाहिए। तो इसे घोषित करें:

char words[16]; 
+3

यह सही नहीं है। scanf इनपुट फ़ील्ड की संख्या सफलतापूर्वक स्कैन की जाती है, कभी भी EOF (-1) नहीं। इसलिए आपका समय लूप अनावश्यक है, यह पहली बार टूट जाएगा। – user411313

+2

@ user411313 नहीं, स्कैनफ ईओएफ वापस कर सकता है, क्योंकि वह तुलना कर रहा है! = यह पहली बार नहीं टूट जाएगा। हालांकि, सामान्य मामले में, आप असाइन किए गए आइटमों की संख्या भी चाहते हैं ताकि आप कुछ सत्यापन कर सकें। – nos

+1

@ उपयोगकर्ता 411313: दोनों [मैन स्कैनफ] (http://www.google.com/search?q=man+scanf) और सी 99 §7.19.6.2/16 कहते हैं कि यह ईओएफ वापस कर सकता है। –

3

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

#include <stdio.h> 
#include <ctype.h> 
int main(void) 
{ 
    char buf[1024], *p, *q; 
    while (fgets(buf, 1024, stdin)) 
    { 
     p = buf; 
     while (*p) 
     { 
      while (*p && isspace(*p)) p++; 
      q = p; 
      while (*q && !isspace(*q)) q++; 
      *q = '\0'; 
      if (p != q) 
       puts(p); 
      p = q; 
     } 
    } 
    return 0; 
} 

और यहां एक और संस्करण है। यह देखने के लिए थोड़ा कठिन है कि यह निरीक्षण द्वारा क्या करता है, लेकिन यदि कोई पंक्ति 1024 वर्णों से अधिक लंबी है तो यह टूट नहीं जाता है, इसलिए यह कोड मैं उत्पादन में उपयोग करता हूं।

#include <stdio.h> 
#include <ctype.h> 
int main(void) 
{ 
    int ch, lastch = '\0'; 
    while ((ch = getchar()) != EOF) 
    { 
     if (!isspace(ch)) 
      putchar(ch); 
     if (!isspace(lastch)) 
      putchar('\n'); 
     lastch = ch; 
    } 
    if (lastch != '\0' && !isspace(lastch)) 
     putchar('\n'); 
    return 0; 
} 
+0

हाँ, यह * से अधिक * सरल है (char buf [1024]; स्कैनफ़ ("% 1023s", buf) == 1;) printf ("% s \ n", buf); ', सिवाय इसके कि आपने बदल दिया अग्रणी, पिछला, और आसन्न सफेद जगह के कुछ मामलों में व्यवहार। –

+0

वास्तविक जीवन में मैं अलग-अलग पात्रों पर एक लूप लिखूंगा जो वास्तव में व्हाइटस्पेस व्यवहार के साथ था (जो शायद ओपी चाहता था या नहीं हो सकता - उन्होंने कहा नहीं), लेकिन यह एक उदाहरण के लिए बहुत कठिन होगा। यदि आप स्कैनफ़ का उपयोग कर रहे हैं तो आपको एज केस व्यवहार या त्रुटि वसूली के बारे में परवाह नहीं करना चाहिए, वैसे भी। – zwol

+0

... आप जानते हैं कि, यह * बहुत * थकाऊ नहीं है। उदाहरण दोहराएं। – zwol

3

आपका कोड लूप जब तक यह एक शब्द भी पढ़ता है, तो बाहर निकल जाता है (ठीक है, वास्तव में क्या मैं उत्पादन में प्रयोग करेंगे tr -s '[:space:]' '\n' है, लेकिन यह कैसे आप ऐसा ही कुछ को लागू है।)। तो यदि आप इसे कई शब्द देते हैं तो यह पहला और बाहर निकल जाएगा, जबकि यदि आप इसे एक खाली इनपुट देते हैं, तो यह हमेशा के लिए लूप होगा। किसी भी मामले में, यह केवल यादृच्छिक स्मृति से यादृच्छिक कचरा मुद्रित करेगा। यह स्पष्ट रूप से नहीं है कि आप क्या चाहते हैं, लेकिन आप क्या चाहते हैं? तुम सिर्फ पढ़ सकते हैं और पहला शब्द प्रिंट (यदि वह मौजूद है) चाहते हैं, का उपयोग करता है, तो:

if (scanf("%15s", word) == 1) 
    printf("%s\n", word); 

यदि आप पाश जब तक आप एक शब्द पढ़ सकते हैं करना चाहते हैं, का उपयोग करते हुए:

while (scanf("%15s", word) == 1) 
    printf("%s\n", word); 

char word[16]; 

दूसरों के बजाय जाँच कई मदों से मिलान कैसे scanf का EOF के लिए परीक्षण का सुझाव दिया है:

इसके अलावा, के रूप में दूसरों का उल्लेख किया है, तो आप शब्द सरणी एक आकार है कि आपके scanf के लिए काफी बड़ा है देने के लिए की जरूरत है। इस मामले के लिए यह ठीक है, जहां स्कैनफ एक ईओएफ होने तक मेल नहीं कर सकता है, लेकिन अन्य मामलों में इतना अच्छा नहीं है (जैसे पूर्णांक पढ़ने की कोशिश कर रहा है), जहां स्कैनफ़ ईओएफ तक पहुंचने के बिना कुछ भी नहीं मिल सकता है (यदि इनपुट नहीं है ' टी संख्या) और वापसी 0।

संपादित

ऐसा लगता है कि मेरे कोड है जो ठीक काम करता है जब मैं इसे चलाने के मैच के लिए अपने प्रश्न बदल गया है - शब्द पढ़ने छोरों तक EOF तक पहुँच जाता है और फिर बाहर निकालता है। तो कुछ और ही अपने कोड के साथ हो रहा है, शायद इनपुट आप इसे कैसे खिला रहे हैं से संबंधित के रूप में डेविड

ने सुझाव दिया
+0

जैसे वास्तविक पार्सर पर जाने से बेहतर होते हैं, लेकिन उत्तर के लिए धन्यवाद, लेकिन क्या आपने इसे आजमाया? मुझे एहसास हुआ कि मैंने अपनी मूल पोस्ट पर "! =" रखा है, लेकिन मेरा मतलब है ==, और यह मुझे वह दे रहा है जो मैं चाहता हूं कि स्कैनफ कहलाए जाने पर मैं एक वाक्य टाइप करूं, फिर यह लूप और शब्दों को प्रिंट करता है जैसे कि यह भी माना जाता है , फिर यह फिर से स्कैनफ को कॉल करता है जिसे मैं नहीं चाहता हूं। यह मुझे लूप से बाहर निकलने का कोई रास्ता नहीं छोड़ता है। शायद मेरा कंपाइलर? लेकिन एकमात्र समस्या यह है कि यह उन सभी शब्दों को प्रिंट करता है जो इसे तोड़ते नहीं हैं। – JJRhythm

+2

@ user315903: यही कारण है कि कुछ ऐसा टाइप करने की कोशिश करने के बजाय, काम नहीं कर रहे कोड को पोस्ट करना सबसे अच्छा विचार है। यदि आपका कोड काम नहीं कर रहा है, जिन कारणों से आप समझ में नहीं आते हैं, तो आप समझ में नहीं आता कि क्या गलत है और समस्या के सार को संरक्षित रखने के लिए खुद पर भरोसा नहीं कर सकता। –

-3

सी उपयोगकर्ताओं के लिए, यह भी काम करेंगे

while (gets(str) != NULL) 
+9

-1 'होट' का उपयोग करने के लिए। –

+2

स्पष्ट होने के लिए, 'होट' के साथ समस्या यह है कि यह आवंटित बफर के अंत से परे लिख सकता है। –

-2

मैं सबसे अच्छा तरीका यह है करने के लिए लगता है ...

int main() 
{ 
    char str[100]; 
    scanf("[^EOF]",str); 
    printf("%s",str); 
    return 0;  
}