2012-11-06 14 views
5

में काम नहीं कर रहा है यह कोड क्यों काम नहीं कर रहा है। बस अगर उपयोगकर्ता इनपुट एक पासवर्डपॉइंटर्स के साथ strcmp सी

char *pass; 

printf("Write the password: "); 
scanf("%s", pass); // Because is a pointer the & is out ? 


if(strcmp(pass , "acopio") == 0) 
+4

क्यों -1? मैं सीख रहा हूँ; यहां जवाब खोजने की कोशिश की; और शुरुआती लोगों के लिए अन्य उत्तरों को समझना आसान नहीं है। – jotape

उत्तर

8

आपने वास्तव में डेटा डालने के लिए किसी भी स्थान को आवंटित नहीं किया है। एक पॉइंटर को परिभाषित करने से केवल एक वैरिएबल को परिभाषित किया जाता है जो डेटा के ब्लॉक के पते को पकड़ सकता है, यह ब्लॉक आवंटित नहीं करता है।

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

नीचे दिए गए उदाहरणों में भी महत्वपूर्ण त्रुटि जांच की आवश्यकता होगी, लेकिन आपको सामान्य विचार दें।

उदा।

char *pass = malloc (SOMESIZE); 

printf("Write the password: "); 
scanf("%s", pass); 


if(strcmp(pass , "acopio") == 0) 

या

char pass[SOMESIZE]; 

printf("Write the password: "); 
scanf("%s", pass); 


if(strcmp(pass , "acopio") == 0) 
+0

बहुत स्पष्ट है। आप दूसरे विकल्प स्कैनफ में भूल गए थे। स्थिर स्मृति (ढेर) की तुलना में गतिशील स्मृति (ढेर) का उपयोग करना बेहतर नहीं था। कौन सा छोटा है? – jotape

+3

आपको स्कैनफ कॉल के लिए एम्पर्सेंड की आवश्यकता नहीं है क्योंकि किसी भी इंडेक्स के बिना किसी सरणी का जिक्र है * पता * यानी पास == और पास [0] – Joe

+0

@ जो उदाहरण है, यानी नहीं/व्याकरण-नाज़ी – Anthony

3

pass एक unitialized सूचक है के रूप में ही है जांच करते हुए, और आप इसे में लिखने के लिए प्रयास करते हैं। आपको स्ट्रिंग रखने के लिए पर्याप्त मेमोरी आवंटित करनी होगी। उदाहरण के लिए, char pass[SIZE] बेहतर काम करेगा।

+0

तो, मुझे एक सूचक का उपयोग करने की ज़रूरत नहीं है; सिर्फ चार सरणी? वास्तव में – jotape

+1

। ध्यान दें कि आप गतिशील आवंटन ('सूचक' के सूचक के साथ भी उपयोग कर सकते हैं, लेकिन यह यहां बेकार है। – md5

1

आपको pass आवंटित करने की आवश्यकता है ताकि scanf में इनपुट को स्टोर करने के लिए एक स्थान होगा। अन्यथा आपके पास स्मृति भ्रष्टाचार है।

0

हाँ सूचक आरंभ नहीं किया गया था। यदि आप इसे डीबग करते हैं तो आपको access violation or segmentation fault मिल जाएगा। कोड को निम्नानुसार बदला जा सकता है।

char pass[22];//22 can be replaced with other number 

    printf("Write the password: "); 
    scanf("%s", pass); 
    if(strcmp(pass , "acopio") == 0) 
    printf("fu");//just to check 
+0

@ डेवशॉ: I इसे पोस्ट करना चाहता था, लेकिन स्टैक ओवरफ्लो मुझे संपादन को सहेजने की अनुमति नहीं देगा <6 बदलावों के बदलाव: डी – anishsane

0

आप एक बफर या इनपुट स्टोर करने के लिए अन्य स्थान को इंगित करने के pass आरंभ नहीं किया है।

कुछ इस तरह सरल के लिए, आप एक सूचक के बजाय char की एक सरणी के रूप में pass घोषणा कर सकते हैं:

char pass[N]; // where N is large enough to hold the password plus a 0 terminator 

scanf("%s", pass); 
if (strcmp(pass, "acopio") == 0) 
{ 
    ... 
} 

जब यह sizeof, _Alignof के संकार्य है, या एकल & ऑपरेटरों, या है सिवाय घोषणा में एक और सरणी शुरू करने के लिए एक स्ट्रिंग शाब्दिक उपयोग किया जा रहा है, अभिव्यक्ति प्रकार "0 -के एन-तत्व सरणी" को "सूचक से T" प्रकार की अभिव्यक्ति में परिवर्तित किया जाएगा (और "क्षय") अभिव्यक्ति का पता होगा सरणी का पहला तत्व।

जब आप scanf और strcmp, अभिव्यक्तिpass "char के एन-तत्व वाली सरणी" से "char सूचक" से बदल जाती है के प्रकार के एक तर्क के रूप pass गुजरती हैं, और अभिव्यक्ति के मूल्य है pass, या &pass[0] के पहले तत्व का पता।यही कारण है कि आपको कॉल में & ऑपरेटर का उपयोग करने की आवश्यकता नहीं है।

इसी तरह, strcmp कॉल में, स्ट्रिंग शाब्दिक "Acopio" (सी में const char ++) के प्रकार के "char के 7-तत्व वाली सरणी" एक अभिव्यक्ति के लिए "char सूचक" से बदल जाती है।

0
#include<stdio.h> 
main() 
{ 
    int mystrcmp(char *,char *); 

    char s1[100],s2[100]; 
    char *p1,*p2; 
    p1=s1; 
    p2=s2; 
    printf("Enter the first string..?\n"); 
    scanf("%s",p1); 
    printf("Enter the second string..?\n"); 
    scanf("%s",p2); 
    int x=mystrcmp(p1,p2); 
    if(x==0) 
     printf("Strings are same\n"); 
    else 
     printf("Strings are not same..\n"); 


} 
int mystrcmp(char *p1,char *p2) 
{ 
    while(*p1==*p2) 
    { 
     if(*p1=='\0' || *p2=='\0') 
      break; 
     p1++; 
     p2++; 
    } 
    if(*p1=='\0' &&as *p2=='\0') 
     return(0); 
    else 
     return(1); 
} 

शुरुआती के लिए सरल कोड ....