目的是创建一个函数,可以将所有字符转换为小写,以避免提问时对大写敏感,类似于 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 并实现该函数。抱歉,有点困难。
许多问题:
char *variable[40];
- 它是一个由 40 个指向 char
的 指针组成的数组。这些指针未初始化。当您取消引用其中任何一个时,您会调用未定义的行为。你想要一个 数组 char
int length = sizeof(*s)/sizeof(*s[0]);
在此范围内不起作用。将指针的大小除以指针的大小,很可能会得到 1。您想使用 strlen。另外 s
需要是 指向 char
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);
}