首页 > 解决方案 > 更改字符串的大小写

问题描述

我是 C 新手,正在尝试编写一个简单的函数,该函数可以接收字符串(或字符数组)并根据以下规则转换其大小写:

  1. 第一个字符应为大写。
  2. 其余字符应为小写。

我已经编写了代码,但遇到了分段错误,我对出了什么问题感到困惑。这是我写的:

void myFunction(char name[]) {

  printf("Before: %s", name);

  name[0] = toupper(name[0]); // This line seems to cause problems.

  // Convert the other letters to lowercase if they aren't already.
  for(int i = 1; name[i] != '\0'; i++) {
    if(islower(name[i])) {
      name[i] = tolower(name[i]);
    } else {
      name[i] = name[i];
    }
  }
  name[i] = '\0';

  printf("After: %s", name);
}


void my_caller(*name1) {
  printf("Name before changing case: %s\n", name1);
  myFunction(name1);
  printf("Name after changing case: %s\n", name1);
}


// In another .c file.
int main() {
  char name1[] = "adam";
  my_caller(&name1);
}

myFunction,如果我注释掉除了

name[0] = toupper(name[0]);

我仍然得到分段错误。所以这表明这条线是罪魁祸首之一,但我不明白为什么。我想将字母转换为大写并将其放回字符串中。

标签: carraysfunction-call

解决方案


首先,有一个函数定义,如

 void my_caller(name1) 

是有问题的,因为缺少类型(过去是,现在已经过时的规则)默认为int. 你希望这是一个char *. 不是int

您需要将其更改为

  void my_caller(char * name1) {.... 

此外,您需要调用函数 as my_caller(name1);,传递数组与传递指向数组第一个元素的指针相同。

此外,在调用函数时,您不会传递数组的地址(如果您感到困惑,请检查类型)。

也就是说,在里面myFunction(),范围i仅限于for循环,但你想在范围之外使用它(以空终止),所以你必须i在功能块范围内声明。

故事的寓意:打开编译器警告/错误设置,并密切注意编译器发出的消息。他们在那里是有原因的。


注意:进行这些更改后,代码按预期工作


推荐阅读