将C字符串转换为所有较低的

将C字符串转换为所有较低的,c,string,pointers,ascii,tolower,C,String,Pointers,Ascii,Tolower,我正在尝试将C字符串转换为所有小写,而不使用ctype.h中的tolower。 然而,我的代码似乎不起作用:我收到一个运行时错误。我想做的是改变大写字母bij'a'-'a'的ASCII值,据我所知,它应该将这些值转换成小写的值 #include <stdio.h> void to_lower(char* k) { char * temp = k; while(*temp != 0) { if(*temp > 'A' && *tem

我正在尝试将C字符串转换为所有小写,而不使用ctype.h中的tolower。
然而,我的代码似乎不起作用:我收到一个运行时错误。我想做的是改变大写字母bij'a'-'a'的ASCII值,据我所知,它应该将这些值转换成小写的值

#include <stdio.h>
void to_lower(char* k) {
    char * temp = k;
    while(*temp != 0) {
        if(*temp > 'A' && *temp < 'Z') {
            *temp += ('a' - 'A');
        }
        temp++;
    }
}

int main() {
    char * s = "ThiS Is AN eXaMpLe";
    to_lower(s);
    printf("%s",s);
}
两个错误

此代码不会将A和Z转换为小写:

if(*temp > 'A' && *temp < 'Z') {

使用>=和两个我可以立即看到的问题:1 char*s=这个。。。创建不可写的字符串。您需要使用字符数组并将字符串复制到其中。2如果*temp>'A'&&*temp<'Z'跳过A和Z。您需要>=和即使您不使用现有的标准库函数,遵循其接口可能仍然有用。tolower转换单个字符。将此函数应用于字符串可以写成解耦合函数

#include <stdio.h>
#include <string.h>

int to_lower (int c) {
    if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c))
        c = c - 'A' + 'a';
    return c;         
}

void mapstring (char *str, int (*f)(int)) {
    for (; *str; str++)
        *str = f(*str);
}

int main() {
    char s[] = "THIS IS MY STRING";

    mapstring(s, to_lower);
    printf("%s\n", s); 
    return 0;
}

您收到的错误有哪些?看起来您有一个额外的}后面的to_lower。看起来您也在修改一个字符串文字,这是一个未定义的行为。@SimpleJ:他没有额外的},这只是一个未格式化的代码。我收到一个运行时错误。数组的内容可以修改。我认为数组是它的内容,仅此而已。它可以隐式转换为指针,但它实际上与常量指针不同。但我认为这也是一种有效的方法。@MooingDuck在某些情况下,字符串文字将位于只读程序内存中。在这种情况下试图修改它会导致程序崩溃。我在为AVR微控制器编程时遇到了这个问题。问题的第一行明确地说,它试图在不使用ctype.h中的tolower的情况下完成此操作。@tux3谢谢。我已经把我的建议写下来了。重点是分离函数,不只是重复使用库,而是模仿库。