将char * string转换为upper

时间:2014-09-09 17:57:58

标签: c string char

以下代码应该返回源的大写字符串。 它工作但不转换字符串。无法弄清楚出了什么问题。

char *StrUpper (char *s) {
    int i = 0;
    char *t = &s [i];
    while (*t) {
        if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32);
        t = &s [i++];
    }
    return (s);
}

int main () {
    printf ("%s\n", StrUpper ("lower case string"));
    return (0);
}

4 个答案:

答案 0 :(得分:4)

字符串文字是指向常量字符数组的常量指针。换句话说,字符串文字是只读

尝试修改常量数据会导致undefined behavior。如果你的程序有未定义的行为,那么它的行为就完全没有了。

答案 1 :(得分:2)

您的代码中存在一些问题:

  1. 您忘记取消引用作业中的字符串:

    t = (t - 32);
    

    应该是

    *t = (*t - 32);
    
  2. 您没有检查正确的范围:

    if ((*t > 0x5a) && (*t < 0x7b)) 
    

    应该是

    if ((*t > 0x6a) && (*t < 0x7b)) 
    

    或者,甚至更好

    if ((*t >= 'a') && (*t <= 'z')) 
    
  3. 你翻过第一个角色两次:

    t = &s [i++];
    

    应该是

    t = &s [++i];
    

    或只是

    t++;
    

答案 2 :(得分:0)

您可能还想更改

  t = &s[i++];

t =  &s[++i];

因为,i ++首先将当前i值分配给索引,然后执行增量,最后第一次重新处理相同的索引。

答案 3 :(得分:0)

首先是这两个陈述

if ((*t > 0x5a) && (*t < 0x7b)) t = (t - 32);
t = &s [i++];

毫无意义。

此表达式声明

t = (t - 32);

更改指针本身。而这句话

t = &s [i++];

不会立即更改指针。

此外还不清楚这些神奇的数字,0x5a,0x7b,32是什么意思。

该功能可以写成

char * StrUpper ( char *s ) 
{
    for ( char *p = s; *p; ++p )
    {
        if ( *p >= 'a' && *p <= 'z' ) *p -= 'a' - 'A';
    } 

    return s;
}

以下是使用函数

的示例
#include <iostream>

char * StrUpper ( char *s ) 
{
    for ( char *p = s; *p; ++p )
    {
        if ( *p >= 'a' && *p <= 'z' ) *p -= 'a' - 'A';
    } 

    return s;
}

int main() 
{
    char s[] = "hello";

    std::cout << s << std::endl;
    std::cout << StrUpper( s ) << std::endl;

    return 0;
}

输出

hello
HELLO

考虑到某些编码系统并不保证所有小写字母都在没有中间代码的情况下相互跟随。所以一般来说这种方法是不正确的。