2013-05-15 10 views
5

है, मैं एक साधारण सी प्रोग्राम चलाने की कोशिश कर रहा हूं लेकिन मुझे यह त्रुटि मिल रही है: "चेतावनी : प्रारूप '% s' 'चार ' टाइप की उम्मीद है, लेकिन तर्क 2 टाइप है 'चार () [20]' "सी - चेतावनी: प्रारूप '% s' प्रकार 'char *' की अपेक्षा करता है, लेकिन तर्क 2 में 'char (*) [20]'

चल रहा है मैक OSX माउंटेन शेर जीसीसी 4.2.1

#include <stdio.h> 

int main() 
{ 
    char me[20]; 

    printf("What is your name?"); 
    scanf("%s",&me); 
    printf("Darn glad to meet you, %s!\n",me); 

    return(0); 
} 
का उपयोग कर टर्मिनल में संकलन

उत्तर

17
scanf("%s",&me); 

होना चाहिए 0
scanf("%s",me); 

Explaination:

"%s" मतलब यह है कि scanf एक चार सरणी के पहले तत्व के लिए सूचक उम्मीद कर रही है। me एक ऑब्जेक्ट सरणी है और पॉइंटर के रूप में मूल्यांकन किया जा सकता है। इसलिए आप जोड़कर सीधे me का उपयोग कर सकते हैं। &me को जोड़ना ‘char (*)[20]’ लिए मूल्यांकन किया जाएगा और अपने scanf char *

कोड आलोचक इंतज़ार कर रहा है:

"%s" का उपयोग करते हुए एक बफर अतिप्रवाह कारण अगर लंबाई के साथ उपयोगकर्ता इनपुट स्ट्रिंग> 20. तो यह "%19s" को बदल सकता है :

scanf("%19s",me); 
+3

यह अच्छा होगा अगर आपने समझाया * क्यों * – Mike

+2

या '..., और मुझे [0]) ', यदि आप वास्तव में' & 'ऑपरेटर का उपयोग करना चाहते हैं। – alk

+4

@ माइक क्योंकि ... रुको, कंपाइलर चेतावनी स्पष्ट रूप से आपको बताती है कि क्यों। –

3
जब यह sizeof, _Alignof के संकार्य है, या एकल & ऑपरेटरों, या छोड़कर

मैं एस स्ट्रिंग अक्षर का उपयोग घोषणा में एक सरणी को प्रारंभ करने के लिए किया जा रहा है, "T के एन-तत्व सरणी" की अभिव्यक्ति को "सूचक से T" की अभिव्यक्ति में परिवर्तित किया जाएगा, और यह मूल्यांकन करेगा सरणी में पहले तत्व का पता।

सरणी me को char की 20-तत्व सरणी के रूप में घोषित किया गया है; आम तौर पर, जब अभिव्यक्तिme आपके कोड में दिखाई देती है, तो इसे "पॉइंटर से char" की अभिव्यक्ति के रूप में माना जाएगा। यदि आपने

scanf("%s", me); 

लिखा था तो आपको त्रुटि प्राप्त नहीं हुई होगी; अभिव्यक्ति me को सही प्रकार की अभिव्यक्ति में परिवर्तित कर दिया गया होगा।

& ऑपरेटर का उपयोग करके, हालांकि, आपने उस नियम को छोड़ दिया है; char के लिए सूचक के बजाय, आप एक सरणी char (char (*)[20]) की है, जो नहीं है क्या scanf, %s रूपांतरण विनिर्देशक के लिए उम्मीद है इसलिए निदान करने के लिए एक सूचक गुजर रहे हैं।

+0

एस/बाईपास/एक अलग एवेन्यू /, या उन लाइनों के साथ कुछ ले लिया, शायद। नियम के कारण, परिणाम अलग है। उद्धरण के लिए +1, भले ही। – Sebivor

+0

नोट: '_Alignof' एन 1570 में एक गलती थी, जिसे मानक में हटा दिया गया था। यह समझ में आता है, क्योंकि '_Alignof' का ऑपरेशन एक प्रकार है,' _Aignignof (टाइप-नाम) ', मनमानी अभिव्यक्ति नहीं। –

+0

@DanielFischer क्या आप कृपया इस पर ध्यान दे सकते हैं। "विसंगति" मैंने इंगित किया है कि यह स्पष्ट है। यह आखिरी टोकन के बारे में है, जो पिछले डेलीमीटर और नल चरित्र के बीच है, एक स्ट्रिंग के लिए आवश्यक 2 डिलीमीटर टोकन - http: //stackoverflow.com/questions/16571060/strtok-issue-if-tokens-are-delimited-by-delimiters-why-is-last-token- –

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