生成不带指针的大写字母

时间:2013-12-21 21:01:58

标签: c string character

我正在尝试编写一个函数(大写),它将字符串中的所有小写字符转换为它们的大写字母。

但是,我的代码中出现了总线10错误。我知道字符串文字不能在C中修改;所以,我不确定这是否是正确的做法。

我的代码如下:

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

int uppercase(char source[])
{
 int i;

 for(i=0; i<=strlen(source); ++i)
    if (source[i]>= 'a' && source[i]<= 'z')
        source[i]= source[i]-'a' +'A';
    else 
        source[i]=source[i];
}

int main(){
    uppercase("cold");

    return 0;
}

理想情况下,此函数应返回COLD。我认为错误在于我的整个if语句。

2 个答案:

答案 0 :(得分:5)

您遇到崩溃的原因是您的代码修改了字符串文字。字符串文字中的字符放在受保护的内存区域中,因此不能更改:它是未定义的行为。

替换此

uppercase("cold");

用这个:

char cold[] = "cold";
uppercase(cold);

现在字符串的字符放在可修改的内存区域中,允许您根据需要进行更改。

答案 1 :(得分:0)

你甚至不知道它就绝对使用指针。

在你的功能定义中

int uppercase(char source[])
编译器将

char source[]视为指向char(char *source

的指针

因此,当将字符串文字传递给uppercase()时,您只需传递它的地址即可。然后在你的函数中你试图修改它导致未定义的行为。

此外,您无法返回整个数组,因此您只需返回指向它的指针。

char *uppercase(char source[])
{
     int i;
     size_t len = strlen(source);
     char *tmp;
     tmp = malloc(len+1);
     if (tmp!=NULL){
         memcpy(tmp, source, len+1);
         for(i=0; i<len; ++i){
            if (tmp[i]>= 'a' && tmp[i]<= 'z'){
                tmp[i]= tmp[i]-'a' +'A';
            }
        }
    }
    return tmp;
}

然后:

int main(){
    char *str = uppercase("cold");
    printf("%s", str);
    free(str);

    return 0;
}

您完成代码:http://ideone.com/BJHDIF