【问题标题】:Producing uppercase letters without pointers生成没有指针的大写字母
【发布时间】:2014-01-10 11:44:59
【问题描述】:

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

但是,我的代码中出现 Bus 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 语句。

【问题讨论】:

  • char s[] = "cold"; uppercase(s);
  • 您已经回答了自己的问题。 “返回”是什么意思?
  • 那么source[i] = source[i]到底有什么意义??
  • 对不起,我应该更清楚。在这种情况下,我不知道如何解决该错误。关键是不做任何改变。我猜这是多余的?
  • 我猜你也应该包括大写()函数/方法。

标签: c string character


【解决方案1】:

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

替换这个

uppercase("cold");

用这个:

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

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

【讨论】:

【解决方案2】:

你在不知不觉中就使用指针。

在你的函数定义中

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

【讨论】:

  • 您需要为空终止符分配空间,并且应该在main 中添加一个free(tmp);
  • strlen 不包含空终止符吗?为什么要释放 tmp,这会导致它丢失,因为函数正在返回它。
  • 不,strlen 不包括终止符。在你完成它之前,你不能在从uppercase 动态分配的返回上调用free,但你应该在某个时候释放它。您的建议泄漏了此内存;在这个小程序中没什么大不了的,但对一般编程来说是非常糟糕的建议。
  • 你忘记了空终止符:)
  • 我不这么认为——malloc(len+1) 为它分配空间,strcpy 复制它。我错过了循环提前完成了一个字符 - 现在已经更正了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多