c - 将字符数组作为函数参数传递
问题描述
我正在尝试将字符串作为参数传递给函数,它会引发分段错误(核心转储)错误。你能告诉我我在这里犯了什么错误吗?这是代码:
replaceChars(char str[], char sChar[], char rChar)
{
int i,j;
printf("rChar is %c", rChar);
printf("sChar is %s", sChar);
for(i = 0; i <= strlen(str); i++)
{
for(j = 0; j <= strlen(sChar); j++)
{
if(str[i] == sChar[j])
{
str[i] = rChar;
//printf("The New String is %c", str[i]);
}
}
}
printf("The New String is %s", str);
}
void main()
{
char myString[36], schar[36], rchar;
printf("Please enter a string:");
scanf("%[^\n]s", &myString);
printf("Which characters to replace?");
scanf(" %[^\n]c", &schar);
printf("With which character?");
scanf(" %[^\n]c", &rchar);
replaceChars(myString, schar, rchar);
}
解决方案
这里有两个问题。
首先,当您遍历str
and时sChar
:
我正在尝试将字符串作为参数传递给函数,它会引发分段错误(核心转储)错误。你能告诉我我在这里犯了什么错误吗?这是代码:
for(i = 0; i <= strlen(str); i++)
{
for(j = 0; j <= strlen(sChar); j++)
{
您将<=
其用作退出条件。数组索引从 0 开始,因此有效索引是从 0 到 length-1。您将从 0 变为长度,因此您正在步进数组的末尾。读取数组末尾会调用未定义的行为。
更改使用条件<
:
for(i = 0; i < strlen(str); i++)
{
for(j = 0; j < strlen(sChar); j++)
{
第二个问题是您如何读取值:
scanf("%[^\n]s", &myString);
...
scanf(" %[^\n]c", &schar);
...
scanf(" %[^\n]c", &rchar);
格式说明%[]
符后面不需要任何字符,它需要 achar *
作为参数,它指向 . 数组的第一个元素char
。在前两种情况下,您传递的是数组的地址而不是数组本身(衰减为指针),并且在%[]
不需要的格式之后有一个额外的字符。char
在第三种情况下,当格式需要指向多个字符的指针时,您将指针传递给单个字符。因为您想读取单个字符,所以您想使用%c
格式说明符。
scanf("%35[^\n]", myString);
...
scanf(" %35[^\n]", schar);
...
scanf(" %c", &rchar);
另请注意,前两个的字段宽度限制了读取的字符数,以免超出数组。
推荐阅读
- assembly - 使用 MIPS 32 汇编语言,如何使用 addu 和 ori 命令加载和添加 4 个整数?
- curl - Ansible Tower localhost 任务的行为不同
- r - BIC 的可重复性通过 R 中的 mclust 包进行潜在类分析
- javascript - 发送对象数组的正确方法是什么,其中对象的一个属性的值必须是文件?
- python - dcc.store 用于实时约会数据表 DASH
- python - Numpy 数组操作;
- reactjs - 在 useEffect 中使用时覆盖 useState 变量
- docker - docker-compose down 不起作用,正在寻找一个不存在的网络,我也没有创建
- flutter - 如何在 Flutter 中使用 DropdowndownButton 在 DataTable 中显示一行?
- java - 使用 Apache Kafka 进行实时消息传递