2011-10-14 7 views
6

मैं सी ++ के लिए एक पूरा newb हूँ, लेकिन नहीं जावा, सी #, जावास्क्रिप्ट, वीबी करने के लिए। मैं दृश्य स्टूडियो 2010सी ++ और printf - अजीब चरित्र उत्पादन

से एक डिफ़ॉल्ट सी ++ कंसोल अनुप्रयोग के साथ काम कर रहा हूँ एक printf मैं कुछ अजीब वर्ण मिलता है करने की कोशिश में। हर बार ऐसा नहीं होता जो मुझे बताता है कि जब भी मैं इसे चलाता हूं तो वे अलग-अलग मेमोरी लोकेशन देख सकते हैं।

कोड:

#include "stdafx.h" 
#include <string> 

using namespace std; 

class Person 
{ 
public: 
    string first_name; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char somechar; 
    Person p; 
    p.first_name = "Bruno"; 

    printf("Hello %s", p.first_name); 
    scanf("%c",&somechar); 
    return 0; 
} 
+3

उपयोग 'सी में cout' ++। % S के साथ printf के लिए आपको 'p.first_name.c_str() 'की आवश्यकता होगी लेकिन C++ में' printf' का उपयोग न करें। –

उत्तर

8

समस्या यह है कि printf/scanf typesafe नहीं हैं। आप std::string ऑब्जेक्ट की आपूर्ति कर रहे हैं जहां printfconst char* की अपेक्षा करता है।/हे printf/scanf वरीयता में धाराओं

एक तरीका यह तय करने के लिए

printf("Hello %s", p.first_name.c_str()); 

लिखने के लिए हालांकि, चूंकि आपने सी ++ में कोडिंग कर रहे हैं, यह एक अच्छा विचार मैं उपयोग करने के लिए है:

std::cout << p.first_name << std::endl; 
std::cin >> c; 
+0

धन्यवाद +1। तो क्या सी ++ में printf के बराबर एक प्रारूपण है? प्रश्न का उत्तर देने के लिए – BuddyJoe

2
printf("Hello %s", p.first_name.c_str()); 

हालांकि, तुम क्यों iostream उपयोग नहीं कर रहे हैं, अगर आप सी का उपयोग कर रहे ++?

+0

+1 क्योंकि मैं इतना नया हूं। जैसा कि हम बोलते हैं, मेरी सी ++ किताबों को फिर से बाहर निकालना। – BuddyJoe

+0

क्योंकि printf() की तुलना में iostream बहुत बहुत धीमी धीमी है। क्या ऐसी कई चीजें हैं जिनकी आपको आवश्यकता नहीं है। गूगल! – Notinlist

2

आप printf में सी ++ std::string वस्तुओं पारित नहीं कर सकते हैं। printf केवल int, float, और char* तरह आदिम प्रकार समझता है। आपका कंपाइलर आपको वहां चेतावनी दे रहा है; यदि यह नहीं है, तो अपने चेतावनी स्तर को क्रैंक करें।

चूंकि आप सी ++ का उपयोग कर रहे हैं, तो आपको टेक्स्ट आउटपुट के लिए std::cout का उपयोग करना चाहिए, और यह std::string ऑब्जेक्ट्स को समझता है। यदि आपको किसी कारण से printf का उपयोग करना है, तो c_str() पर कॉल करके std::string को const char* पर कनवर्ट करें।

4

एक सी स्ट्रिंग के लिए स्ट्रिंग में कनवर्ट करें।

printf("Hello %s", p.first_name.c_str()); 

इसके अलावा, चूंकि आप सी ++ का उपयोग कर रहे हैं, तो आपको प्रिंटफ के विरोध में कोउट के बारे में जानना चाहिए!

+0

+1 और फिर उसे सही दिशा में दबाकर। – Lou

0

printf("%s") एक सी-स्टाइल स्ट्रिंग स्वीकार करता है जिसे '\0' द्वारा समाप्त किया जाता है। हालांकि, string ऑब्जेक्ट सी ++ ऑब्जेक्ट है जो सी-स्टाइल स्ट्रिंग से अलग है। आपको std::cout का उपयोग करना चाहिए जो string को सीधे टाइप करने के लिए ओवरलोड किया गया है, जैसा कि नीचे दिखाया गया है।

std::cout << p.first_name; 
+0

ठीक है, तो आपने दिखाया कि पहले नाम को कैसे आउटपुट किया जाए। "हैलो" शब्द के बारे में क्या? –

+0

@ जिम, "हैलो" ओपी के लिए पहले से ही यह सही w/printf किया था। अन्य छोटे भागों को अनदेखा करते हुए, आपको प्रश्न के मुख्य भाग को पहचानने की कोशिश करनी चाहिए। सही? –

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