【问题标题】:Uppercase in C languageC语言中的大写
【发布时间】:2012-05-28 05:26:15
【问题描述】:

我有这个代码:

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

这个方法应该得到一个char* 变量,并将其更改为大写。出于某种原因,我收到一条错误消息 EXECUTE_BAD_ACCESS

调用函数:

char* s = "itzik";
changeToCapital(s);
printf("%s\n",s);

我在这里做错了什么?

【问题讨论】:

  • 您是否尝试修改字符串文字?
  • 听起来像指针问题 - str 崩溃时指向的字符串是什么?
  • 我在做str[i],那不是字符吗?
  • 你的函数需要一个char *。你需要通过&amp;str[i]
  • @MikeKwan 不,实施很好(好吧,如果实施得当,它可能会很好......)。问题是他正在修改字符串文字。

标签: c uppercase


【解决方案1】:

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

char *ptr = "Hello";
changeToCapital(ptr); // <<== ERROR !

您可以更改调用以避免错误:

char ptr[] = "Hello";
changeToCapital(ptr);

附带说明,您对大写的更改仅在所有字母都为小写时才有效。您应该使用toupper(ch) 函数而不是减去 32。

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

【讨论】:

  • toupper(ch) 仍然不能用于Turkish
  • @Robert Cooper - 谁对土耳其大发雷霆!!
  • @RobertCooper 我认为不为土耳其语(以及许多其他语言)工作仍然比不为英语工作要好:)
【解决方案2】:

第一:

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

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

char *str = "Hello World";
changeToCapital(str);

不好"Hello World"const,不能被你的程序修改。相反,您应该将字符串指定为字符数组,以确保它是不可变的:

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

【讨论】:

  • strlen(str) 的值在他的代码中不是常量。考虑str[i] =str[i] -32;str[i] == ' '时的效果。
  • @Robᵩ 这只是一个糟糕的设计,不检查意外结果(因此将任何特殊字符处理为小写字母)。
  • @H2CO3 - 毫无疑问,OP 的程序在许多层面上都是错误的。我只是观察到 Richard 的优化不会产生相同的结果。
  • 当然,因为 Richard 的修复使函数至少在某些情况下可以工作,而不是总是导致错误。
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2022-01-21
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多