C语言中的大写字母

C语言中的大写字母,c,uppercase,C,Uppercase,我有以下代码: void changeToCapital(char* str) { int i; for (i=0; i<strlen(str); i++) { str[i] =str[i] -32; } } 我在这里做错了什么?这很可能是因为您正在向它传递一个指向不可写内存的指针,例如从字符串文本中获取的指针: char *ptr = "Hello"; changeToCapital(ptr); // <<== ERROR

我有以下代码:

void changeToCapital(char* str)
{
    int i;
    for (i=0; i<strlen(str); i++) 
    {
        str[i] =str[i] -32;
    }
}

我在这里做错了什么?

这很可能是因为您正在向它传递一个指向不可写内存的指针,例如从字符串文本中获取的指针:

char *ptr = "Hello";
changeToCapital(ptr); // <<== ERROR !
另一方面,只有当所有字母都是小写时,才可以改为大写。您应该使用
toupper(ch)
函数而不是减法32

void changeToCapital(char* str) {
    for (; *str = toupper(*str) ; str++)
        ;
}

这很可能是因为您正在向它传递一个指向不可写内存的指针,例如从字符串文本中获取的指针:

char *ptr = "Hello";
changeToCapital(ptr); // <<== ERROR !
另一方面,只有当所有字母都是小写时,才可以改为大写。您应该使用
toupper(ch)
函数而不是减法32

void changeToCapital(char* str) {
    for (; *str = toupper(*str) ; str++)
        ;
}
第一:

您一直在计算strlen。相反,您应该将字符串的长度存储在局部变量中

第二:您可能是这样调用函数的:

char *str = "Hello World";
changeToCapital(str);
这是坏的<代码>“Hello World”是
const
,不能由您的程序修改。相反,您应该将字符串指定为字符数组,以确保其不可变:

char str[] = "Hello World";
changeToCapital(str);
第一:

您一直在计算strlen。相反,您应该将字符串的长度存储在局部变量中

第二:您可能是这样调用函数的:

char *str = "Hello World";
changeToCapital(str);
这是坏的<代码>“Hello World”是
const
,不能由您的程序修改。相反,您应该将字符串指定为字符数组,以确保其不可变:

char str[] = "Hello World";
changeToCapital(str);


您是否正在尝试修改字符串文字?听起来像是指针问题-当它崩溃时,
str
指向的字符串是什么?我正在执行str[i],这不是字符吗?不过,您的函数使用的是
char*
。您需要传递它
&str[i]
@MikeKwan-nope,实现是好的(如果实现得好的话,它可能是好的…)。问题是他正在修改一个字符串文字。你是在试图修改一个字符串文字吗?听起来像是指针问题-当它崩溃时,
str
指向的字符串是什么?我在做str[i],这不是一个字符吗?不过你的函数使用了一个
char*
。您需要传递它
&str[i]
@MikeKwan-nope,实现是好的(如果实现得好的话,它可能是好的…)。问题是他正在修改字符串文字。
strlen(str)
的值在他的代码中不是常量。考虑<代码> STR[i]=STR [i] - 32的影响;<代码>当
str[i]=''
@Robᵩ 这只是一个糟糕的设计,不检查意外结果(从而将任何特殊字符处理为小写字母)。@H2CO3-毫无疑问,OP的程序在很多方面都是错误的。我只是观察到Richard的优化不会产生相同的结果。当然,因为Richard的修复至少在某些情况下使函数工作,而不是总是导致错误。
strlen(str)
的值在他的代码中不是常量。考虑<代码> STR[i]=STR [i] - 32的影响;<代码>当
str[i]=''
@Robᵩ 这只是一个糟糕的设计,不检查意外结果(从而将任何特殊字符处理为小写字母)。@H2CO3-毫无疑问,OP的程序在很多方面都是错误的。我只是观察到Richard的优化不会产生相同的结果。当然,因为Richard的修复至少在某些情况下使函数工作,而不是总是导致错误。而且
toupper(ch)
仍然不适用于@Robert Cooper,他对Turkish很感兴趣@RobertCooper我认为不为土耳其语(以及其他许多语言)工作仍然比不为英语工作要好:)而且
toupper(ch)
仍然不会为@Robert Cooper工作,他对土耳其语很感兴趣@RobertCooper我认为不为土耳其语(以及其他许多语言)工作仍然比不为英语工作要好:)