【问题标题】:Converting a C-String to all lower将 C 字符串转换为所有较低的字符串
【发布时间】:2015-01-06 23:25:41
【问题描述】:

我正在尝试将 C-String 转换为全小写,而不使用 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);
}

【问题讨论】:

  • 您收到的错误是什么?看起来你在to_lower 之后多了一个}
  • 看起来您正在修改未定义行为的字符串文字。
  • @SimpleJ:他没有多余的},只是未格式化的代码。
  • 我收到运行时错误。

标签: c string pointers ascii tolower


【解决方案1】:

两个错误。

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

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

请改用 >= 和

尝试修改字符串是不合法的!数组可以修改,字符串文字不能。

char * s = "ThiS Is AN eXaMpLe"; 更改为 char s[] = "ThiS Is AN eXaMpLe";

【讨论】:

  • 可以修改数组的内容。
  • 我认为数组就是它的内容,仅此而已。它可以隐式转换为指针,但它实际上与 const 指针不同。但我想这也是一种有效的看待它的方式。
  • @MooingDuck 在某些情况下,字符串文字将位于只读程序内存中。在这种情况下尝试修改它会导致程序崩溃。我在编写 AVR 微控制器时遇到了这个问题
【解决方案2】:

即使您不使用现有的标准库函数,遵循其接口可能仍然有用。 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;
}

【讨论】:

  • 问题的第一行明确表示它正在尝试“不使用 ctype.h 中的 tolower”。
  • @tux3 谢谢。我重新写了我的建议。关键在于分离功能,不仅仅是重用库,而是模仿它。
【解决方案3】:

我可以立即看到两个问题:(1)char *s = "This..." 创建了一个不可写的字符串。您需要使用字符数组并将字符串复制到其中。 (2)if (*temp &gt; 'A' &amp;&amp; *temp &lt; 'Z')跳过A和Z。你需要&gt;=&lt;=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多