在 C 中重新实现 tolower() 时出现段错误 [已关闭]

问题描述 投票:0回答:1

目的是创建一个函数,可以将所有字符转换为小写,以避免提问时对大写敏感,类似于 python 中的

.lower()
。目前,下面的代码将出现“zsh:分段错误”

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

void lower(char *s[]){
    int length = sizeof(*s)/sizeof(*s[0]);
    int i;

    for(i = 0; i < length; i++){
        if (*s[i] >= 'A' && *s[i] <= 'Z'){
            s[i] += 32;
        }
    }
    printf("%s",*s);
}

int main(){
    char *variable[40];
    printf("what would you like to do: ");
    fgets(*variable, sizeof(*variable),stdin);
    lower(variable);
    printf("%s", *variable);
    return 0;

}

我尝试过

int length = sizeof(*s)/sizeof(*s[0]);
和其他改变长度的方法,包括使用普通数字,将相同的长度分配给字符长度。我该如何解决这个问题?

谢谢你。

P.S 我不想为此使用预制函数,因为我想更好地理解 C 并实现该函数。抱歉,有点困难。

c string segmentation-fault
1个回答
1
投票

许多问题:

  1. char *variable[40];
    - 它是一个由 40 个指向 char
    指针组成的数组。这些指针未初始化。当您取消引用其中任何一个时,您会调用未定义的行为。你想要一个 数组
    char
  2. int length = sizeof(*s)/sizeof(*s[0]);
    在此范围内不起作用。将指针的大小除以指针的大小,很可能会得到 1。您想使用 strlen。另外
    s
    需要是 指向
    char
  3. 的指针
void lower(char *s){
    size_t length = strlen(s);
    for(size_t i = 0; i < length; i++){
        if (s[i] >= 'A' && s[i] <= 'Z'){
            s[i] += 'a' - 'A';
        }
    }
    printf("'%s'\n",s);
}

int main(){
    char variable[40];
    printf("what would you like to do: ");
    fgets(variable, sizeof(variable),stdin);
    lower(variable);
    printf("`%s`\n", variable);
}

https://godbolt.org/z/4s4r7ffn1

但是使用

tolower
功能要好得多:

void lower(char *s){
    size_t length = strlen(s);
    for(size_t i = 0; i < length; i++)
        s[i] = tolower(s[i]);
    printf("'%s'\n",s);
}
© www.soinside.com 2019 - 2024. All rights reserved.