无法修改循环内的数组(C)

时间:2018-09-16 21:27:41

标签: c arrays string function

我目前正在开发一个小程序,该程序需要一个函数来返回字符串(字符数组)和两个参数(phrase,c)。 “短语”是字符串输入,“ c”是将从短语中删除的字符。剩余的空格也将被删除。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//This method has two parameters: (str, c)
//It will remove all occurences of var 'c'
//inside of 'str'
char * rmchr(char * str, char *c) {
    //Declare result array
    char *strVal = (char *) malloc(sizeof(char) * strlen(str));

    //Iterate through each character
    for (int i = 0; i < strlen(str); i++) {
            *(strVal+i) = str[i];
        //Check if char matches 'c'
        if (strVal[i] != *c){
            //Assign filtered value to new array
            *(strVal+i) = str[i];
            printf("%c", strVal[i]);
        }
    }
    return strVal;
}

int main()
{
    char * result = rmchr("This is a great message to test with! It includes a lot of examples!","i");
    return 1;
}

在'rmchr'函数(如果声明)内,该数组精确地打印出我想要返回的方式:

Ths s a great message to test wth! It ncludes a lot of examples!

问题是我的返回变量'strVal'没有在if语句之外修改。如何永久修改数组,以便理想的输出返回到“结果”内部(在main内部)。

1 个答案:

答案 0 :(得分:0)

我看到一些要解决的问题。基本上,此代码直接按原样直接复制输入字符串。相同的*(strVal+i) = str[i];分配在代码中的两个位置发生,而忽略了与*c的比较。如果没有一些二级索引变量j,就很难跟踪接收字符串的结尾。

其他说明:

  • 您的free没有malloc;这会造成内存泄漏。

  • 您返回退出代码1,该退出代码表示程序异常终止。 return 0表示正常退出。

  • 不强制转换指针malloc返回;这样可以隐藏错误。

  • 验证malloc成功,如果失败则退出。

  • strlen()是一个线性时间操作,它会在每次调用时遍历整个参数字符串。调用一次并将结果存储在变量中以节省周期。

  • 此代码无法按要求处理多余的空格。

请参阅以下示例,以解决上述问题:

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

char *rmchr(char *str, char *c) {
    int i = 0;
    int j = 0;
    int len = strlen(str);
    char *result = malloc(sizeof(*result) * (len + 1));

    if (result == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }

    while (i < len) {
        if (str[i] != *c) {
            result[j++] = str[i++];
        }
        else {
            for (i++; i < len && str[i] == ' '; i++);
        }
    }

    result[j] = '\0';
    return result;
}

int main() {
    char *result = rmchr("This is a great message to test with! It includes a lot of examples!", "i");

    for (int i = 0; i < strlen(result); i++) {
        printf("%c", result[i]);
    }

    free(result);
    return 0;
}

输出:

Ths s a great message to test wth! It ncludes a lot of examples! 

还有一个repl