2012-06-29 30 views
7

में कनवर्ट करें मेरे पास char है जो fgets से दिया गया है, और मैं जानना चाहता हूं कि मैं इसे char* में कैसे परिवर्तित कर सकता हूं।सी चार को चार *

मुझे यकीन है कि यह पहले पोस्ट किया गया है, लेकिन मुझे वह नहीं मिला जो मैं करना चाहता था। किसी भी उत्तर की सराहना की है।

संपादित करें: यहां कोड है।

char *filename = "file.txt"; 
FILE *file = fopen(filename, "r"); 
if(file != NULL) { 
    char line[260]; 
    char *fl; 
    while(fgets(line, sizeof line, file) != NULL) { 
    // here I combine some strings with the 'line' variable. 
    str_replace(line, "\"", "\"\""); // A custom function, but it only takes char*'s. 
    } 
    printf(fl); 
    printf("\n"); 
} else { 
    printf(" -- *ERROR* Couldn't open file.\n"); 
} 
+15

नहीं, आप नहीं करते हैं। 'fgets() '' char * 'परिणाम देता है, न कि' char'। कृपया हमें कुछ वास्तविक कोड पोस्ट करके, जो आप करने का प्रयास कर रहे हैं, उसके बारे में एक बेहतर विचार दें। –

+0

ओह। मेरी गलती। इसका मतलब है कि मुझे अब इस सवाल की ज़रूरत नहीं है। – Matthew

+0

फिर आप स्वयं प्रश्न (और चाहिए) हटा सकते हैं। –

उत्तर

16

ठीक है, सब से पहले, line तो आप के बारे में चिंता की जरूरत नहीं है, char रों की एक सरणी है और इसलिए एक char * (महत्वपूर्ण अंतर के लिए comp.lang.c FAQs देखें) के रूप में ज्यादा एक ही तरीके से हेरफेर किया जा सकता यह।

हालांकि, मामले में आप & ऑपरेटर है सामान्य प्रश्न का उत्तर ...

चाहते है कि तुम क्या जरूरत है:

char c; 
char *pChar = &c; 

हालांकि, ध्यान भालू कि pChar के लिए सूचक है चार और केवल वैध होगा जबकि सी गुंजाइश में है। इसका मतलब है कि आप एक समारोह से पीसीएचआर वापस नहीं कर सकते हैं और इसे काम करने की उम्मीद करते हैं; यह ढेर के कुछ हिस्से को इंगित करेगा और आप वैध रहने के लिए उम्मीद नहीं कर सकते हैं।

char c; 
char *pChar = malloc(sizeof(char)); 

/* check pChar is not null */ 

*pChar = c; 
+0

"' line' एक 'char *' है, क्योंकि यह 'char's' की सरणी है - नहीं, सरणी पॉइंटर्स नहीं हैं। [Comp.lang.c FAQ] (http://www.c-faq.com) की सेक्शन 6 पढ़ें। –

+0

@ किथ थॉम्पसन: "... हालांकि वे निकट से संबंधित हैं"। [प्रश्न 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

प्रश्न 6.2 यह स्पष्ट करता है कि वे पूरी तरह से अलग अवधारणाएं हैं। हाँ, वे बारीकी से जुड़े हुए हैं; तो किसी भी प्रोग्रामिंग भाषा में बहुत सारी अवधारणाएं हैं। एक व्यापक गलतफहमी है कि सी सरणी वास्तव में पॉइंटर्स हैं; चलो इसमें शामिल नहीं है। –

4

& ऑपरेटर का उपयोग करके आप एक सूचक दे ​​देंगे:

आप एक वापसी मान के रूप में यह पारित करने के लिए चाहते हैं, आप ग के मूल्य में लिखने के लिए कुछ स्मृति malloc और फिर सूचक का उपयोग करने की आवश्यकता होगी चरित्र के रूप में, जैसा कि डांक्रंब ने उल्लेख किया था, लेकिन आपके द्वारा उल्लिखित संकेतक को वापस करने से रोकने के दायरे की समस्या है।

मुझे जो चीज जोड़नी है वह यह है कि मुझे लगता है कि char* का कारण यह है कि आप इसे printf या कुछ समान स्ट्रिंग के रूप में उपयोग कर सकते हैं। आप इसे इस तरह से उपयोग नहीं कर सकते क्योंकि स्ट्रिंग NULL समाप्त नहीं होगी। एक स्ट्रिंग में एक char बदलने के लिए, आप की तरह कुछ करने की आवश्यकता होगी

char c = 'a'; 
char *ptr = malloc(2*sizeof(char)); 
ptr[0] = c; 
ptr[1] = '\0'; 

बाद में ptr मुक्त करने के लिए मत भूलना!

+1

malloc तर्क: 'sizeof (char)' st' द्वारा '1' है; आप केवल लिख सकते हैं: 'malloc (2)' जो बराबर है। – Jack

+0

@ जैक, क्या ऐसा करने का कोई विशेष कारण है, हालांकि, 'sizeof' का उपयोग करने के सामान्य सूत्र का पालन करने के बजाय? – Daniel

+0

जब चार्ज बाइट होने के लिए अनिवार्य होता है तो यह चार्जों की गिनती को बाइट्स की गिनती में परिवर्तित करने के लिए अनावश्यक रूप से वर्बोज़ लगता है। क्या आप 'malloc ((strlen (foo) +1) * sizeof (char)) लिखेंगे' 'foo' की एक प्रति के लिए स्थान आवंटित करते समय? किसी भी मामले में, मैं 'foo = malloc (n * sizeof * foo)' पसंद करता हूं, जो foo के प्रकार के बावजूद काम करता है। –