首页 > 解决方案 > 将字符数组作为函数参数传递

问题描述

我正在尝试将字符串作为参数传递给函数,它会引发分段错误(核心转储)错误。你能告诉我我在这里犯了什么错误吗?这是代码:

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);

}

标签: carraysstringfunction

解决方案


这里有两个问题。

首先,当您遍历strand时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);

另请注意,前两个的字段宽度限制了读取的字符数,以免超出数组。


推荐阅读