2014-05-01 20 views
13

Tôi cần chuyển đổi một chuỗi trong C++ thành chữ hoa toàn bộ. Tôi đã tìm kiếm một lúc và thấy một cách để làm điều đó:Làm thế nào để chuyển đổi chuỗi C++ thành chữ hoa

#include <iostream> 
#include <algorithm> 
#include <string> 

using namespace std; 

int main() 
{ 
    string input; 
    cin >> input; 

    transform(input.begin(), input.end(), input.begin(), toupper); 

    cout << input; 
    return 0; 
} 

Thật không may điều này không làm việc và tôi đã nhận được thông báo lỗi này:

không có chức năng phù hợp cho cuộc gọi đến 'transform (std: :. basic_string :: iterator, std :: basic_string :: iterator, std :: basic_string :: iterator,

tôi đã thử phương pháp khác cũng đã không làm việc này là gần gũi nhất với làm việc

Vì vậy. những gì tôi đang hỏi là những gì tôi đang làm sai. Có thể cú pháp của tôi là xấu hoặc tôi cần phải bao gồm một cái gì đó. Tôi không chắc.

tôi có hầu hết các thông tin của tôi ở đây: http://www.cplusplus.com/forum/beginner/75634/ (hai bài gần đây)

Trả lời

19

Bạn cần phải đặt một dấu hai chấm đôi trước toupper:

transform(input.begin(), input.end(), input.begin(), ::toupper); 

Giải thích:

Có hai khác nhau toupper chức năng:

  1. toupper trong không gian tên toàn cầu (truy cập với ::toupper), mà xuất phát từ C.

  2. toupper trong std namespace (truy cập với std::toupper) trong đó có nhiều quá tải và có thể do đó không thể chỉ đơn giản là tham chiếu với chỉ một cái tên. Bạn cần phải rõ ràng đúc nó vào một chữ ký chức năng cụ thể để có thể được tham chiếu, nhưng mã để nhận một con trỏ hàm trông xấu xí: static_cast<int (*)(int)>(&std::toupper)

Vì bạn using namespace std, khi viết toupper, 2. da 1 và do đó được chọn, theo quy tắc phân giải tên.

+3

Hoặc thoát khỏi 'cái using namespace std; '... –

+0

Tôi đoán rằng sẽ làm việc quá. BTW cảm ơn các bạn đã giúp tôi giải quyết vấn đề khó chịu này mà tôi đã cố gắng sửa chữa trong một thời gian. –

+0

@LokiAstari: Vấn đề là bạn muốn 'toupper' toàn cầu, không phải' std :: 'một, làm nổi bật vấn đề với' không gian tên sử dụng std' - nó gây ô nhiễm không gian tên mặc định với nhiều ký hiệu bạn không muốn chỉ để có được một hoặc hai.Nếu bạn chỉ muốn nhập một vài ký hiệu, bạn chỉ nên nhập các ký hiệu đó chứ không phải toàn bộ không gian tên 'std'. –

5

Boost chuỗi các thuật toán:

#include <boost/algorithm/string.hpp> 
#include <string> 

std::string str = "Hello World"; 

boost::to_upper(str); 

std::string newstr = boost::to_upper_copy("Hello World"); 

Convert a String In C++ To Upper Case

4

Hãy thử chương trình nhỏ này, trực tiếp từ C++ reference

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <functional> 
#include <cctype> 

using namespace std; 

int main() 
{ 
    string s; 
    cin >> s; 
    std::transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int, int>(std::toupper)); 
    cout << s; 
    return 0; 

} 

Live demo

0

Bạn có thể làm:

string name = "john doe"; //or just get string from user... 
for(int i = 0; i < name.size(); i++) { 
    name.at(i) = toupper(name.at(i)); 
} 
Các vấn đề liên quan