2011-10-14 38 views
6

Tôi là một newb hoàn chỉnh đối với C++, nhưng không phải là Java, C#, JavaScript, VB. Tôi đang làm việc với một ứng dụng giao diện điều khiển C++ mặc định từ Visual Studio 2010.C++ và printf - đầu ra ký tự lạ

Khi cố gắng thực hiện printf, tôi nhận được một số ký tự lạ. Không giống nhau mỗi lần mà nói với tôi rằng họ có thể nhìn vào vị trí bộ nhớ khác nhau mỗi khi tôi chạy nó.

Code:

#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

Sử dụng 'cout' trong C++. Đối với printf với% s, bạn sẽ cần 'p.first_name.c_str()' nhưng không sử dụng 'printf' trong C++. –

Trả lời

8

Vấn đề là printf/scanf không an toàn. Bạn đang cung cấp đối tượng std::string trong đó printf mong đợi một const char*.

Một cách để sửa lỗi này là viết

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

Tuy nhiên, kể từ khi bạn mã hóa trong C++, đó là một ý tưởng tốt để sử dụng I/O suối trong ưu tiên cho printf/scanf:

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

Cảm ơn +1. Vì vậy, có một định dạng tương đương với printf trong C + +? – BuddyJoe

2

Sử dụng printf("Hello %s",p.first_name.c_str());!

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

Tuy nhiên, tại sao bạn không sử dụng iostream, nếu bạn đang sử dụng C++?

+0

+1 vì tôi là một người mới. Phá vỡ các cuốn sách C++ của tôi ra một lần nữa khi chúng ta nói. – BuddyJoe

+0

Vì iostream rất rất rất chậm so với printf(). Có rất nhiều thứ mà bạn không cần. Google! – Notinlist

2

Bạn không thể chuyển đối tượng C++ std::string vào printf. printf chỉ hiểu các loại nguyên thủy như int, floatchar*. Trình biên dịch của bạn nên đang cảnh báo cho bạn ở đó; nếu không, hãy tăng mức cảnh báo của bạn lên.

Vì bạn đang sử dụng C++, bạn thực sự nên sử dụng std::cout cho đầu ra văn bản và điều đó không hiểu đối tượng std::string. Nếu bạn thực sự phải sử dụng printf vì một số lý do, hãy chuyển đổi std::string thành const char* bằng cách gọi phương thức c_str() trên đó.

4

Chuyển chuỗi thành chuỗi c.

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

Ngoài ra, vì bạn đang sử dụng C++, bạn nên tìm hiểu về cout như trái ngược với printf!

+0

+1 để trả lời câu hỏi và sau đó đẩy anh ta đi đúng hướng. – Lou

0

printf("%s") chấp nhận chuỗi kiểu c bị chấm dứt bởi '\0'. Tuy nhiên, đối tượng string là đối tượng C++ khác với một chuỗi kiểu c. Bạn nên sử dụng std::cout bị quá tải để xử lý trực tiếp string, như được hiển thị bên dưới.

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

OK, vì vậy bạn đã chứng minh cách xuất tên đầu tiên. Còn chữ "Hello" thì sao? –

+0

@Jim, cho "Hello" OP đã làm đúng với w/printf. Bạn nên thử nhận dạng phần chính của câu hỏi, bỏ qua các phần tầm thường khác. Đúng? –

Các vấn đề liên quan