2015-03-31 83 views
-2

我不允许使用toupper()如何将字符串转换为大写C++

这些是我的函数,一个函数必须通过引用传递字符串。

void Uppercase(string x) 
{ 
int y = 0; 
while (y < x.length) 
{ 
    x[y] = x[y] - 32; 
    y++; 
} 
} 

void uppercase(string &x) 
{ 
int y = 0; 
while (y < x.length) 
{ 
    x[y] = x[y] - 32; 
    y++; 
} 

我至少有正确的想法吗?

我得到这个错误,当我建立它....

错误5错误C2446: '<':无论从“无符号整型(__thiscall的std :: basic_string的,性病::分配器转换> :: * )(void)throw()const'to'int'c:\ users \ edwingomez \ documents \ visual studio 2013 \ projects \ homework \ homework \ homework6.cpp 18 1作业

+0

32是一个幻数,应至少用一个常数代替。 – chris 2015-03-31 16:47:23

+0

您需要检查字符是否在正确的范围'a' - 'z'中,并且第一个函数不会做任何事情,字符串在内部被修改,但结果是看不到的。 – NetVipeC 2015-03-31 16:47:53

+0

你遗漏了括号:'x.length()'。 – molbdnilo 2015-03-31 16:59:03

回答

0

这是正确的。但是你应该注意在输入上添加检查。您可以检查这些字符是否为小写字母。

if (x[y] <= 'z') && (x[y] >= 'a') 
    x[y] = x[y] - 32; 

为了增强可读性,你应该'a' - 'A'取代32

另外,你的第一个函数什么都不做。它创建一个字符串的副本。请执行所需的操作。然后丢弃它,因为你没有返回它,并且函数结束。

+0

也许你应该更换123和96? – Slava 2015-03-31 16:50:16

+0

@Slava:谢谢你。 – therainmaker 2015-03-31 16:51:06

1

std::transform功能与lambda expression是做到这一点的一种方法:

std::string s = "all uppercase"; 
std::transform(std::begin(s), std::end(s), std::begin(s), 
    [](const char& ch) 
    { return (ch >= 'a' && ch <= 'z' ? ch - 32 : ch) }); 
std::cout << s << '\n'; 

应该输出

ALL UPPERCASE 

但是,如果系统正在使用的ASCII字符集(或ch - 32表达式会给出意想不到的结果)。

+0

“不允许在问题 – 2015-03-31 16:53:33

+0

中使用toupper()”对于那些没有C++ 11的人,应该在'toupper'中包含'transform'。 – 2015-03-31 17:20:36

+0

'touper'的'transform'可能很容易导致未定义的行为,因为'toupper'被指定为UB,如果参数不能表示为'unsigned char'(其中负值为'char' ) – 2015-03-31 18:08:15

0

示例代码:

  • 随着一系列正确的检查。
  • 使用C++ 11版本(使用范围for循环)。

注意:生产版本应该使用toupper。但是OP明确表示不能使用。

代码:

#include <iostream> 

const char upper_difference = 32; 

void uppercaseCpp11(std::string& str) { 
    for (auto& c : str) { 
     if (c >= 'a' && c <= 'z') 
      c -= upper_difference; 
    } 
} 

std::string UppercaseCpp11(std::string str) { 
    uppercaseCpp11(str); 
    return str; 
} 

void uppercase(std::string& x) { 
    for (unsigned int i = 0; i < x.size(); ++i) { 
     if (x[i] >= 'a' && x[i] <= 'z') 
      x[i] -= upper_difference; 
    } 
} 

std::string Uppercase(std::string x) { 
    uppercase(x); 
    return x; 
} 

int main() { 
    std::cout << Uppercase("stRing") << std::endl; 
    std::string s1("StrinG"); 
    uppercase(s1); 
    std::cout << s1 << std::endl; 

    std::cout << UppercaseCpp11("stRing") << std::endl; 
    std::string s2("StrinG"); 
    uppercaseCpp11(s2); 
    std::cout << s2 << std::endl; 

    return 0; 
} 
0
string x = "Hello World"; 
    char test[255]; 
    memset(test, 0, sizeof(test)); 
    memcpy(test, x.c_str(), x.capacity()); 
    for (int i = 0; i < x.capacity(); i++) 
    { 
     if (test[i] > 96 && test[i] < 123) 
      test[i] = test[i] - 32; 
    } 

    x.assign(test); 
3

由于使用toupper限制令我傻了,适得其反,我可能会以一种方式这样的分配随后的禁令,而侧面的信件作出答复-stepping其意图不言自明,是这样的:

#include <locale> 
#include <iostream> 

struct make_upper : private std::ctype <char> { 
    void operator()(std::string &s){ 
     do_toupper(&s[0], &s[0]+s.size()); 
    } 
}; 

int main() { 
    std::string input = "this is some input."; 
    make_upper()(input); 
    std::cout << input; 
} 

这当然会产生预期的结果:

THIS IS SOME INPUT. 

与我在此处发布的其他答案不同,这仍然具有使用toupper的所有正常优点,例如在使用EBCDIC而不是ASCII编码的计算机上工作。

与此同时,我想我应该承认(例如)当我在小学五年级的时候,我曾被告知要做“写作”,我不会在课堂上讲话“,50次。”所以我翻过一篇文章,其中有一句话写着:“我不会在课堂上讲50次”。玛丽艾伦姐妹(是的,天主教学校)并不特别高兴。

相关问题