打印包含元音的子字符串

时间:2018-01-29 18:16:37

标签: c substring

我基本上是在尝试编写一个函数来返回一个包含输入字符串中元音的子字符串,我的函数是这样的:

char * get_vow(char *inp_arr,int arr_size);

int main()
{
    char my_arr[7] = "Mahmoud";
    char *result = get_vow(my_arr,7);

    printf("%s", result);
}

char * get_vow(char *inp_arr,int arr_size){
    int i,out_arr_counter = 0;
    char * out_arr;
    for(i = 0;i<arr_size;i++){
    switch(tolower(inp_arr[i])){
            case 'a' :
                *(out_arr+out_arr_counter) = inp_arr[i];
                out_arr_counter++;
                break;
            case 'e' :
                *(out_arr+out_arr_counter) = inp_arr[i];
                out_arr_counter++;
                break;
            case 'i' :
                *(out_arr+out_arr_counter) = inp_arr[i];
                out_arr_counter++;
                break;
            case 'o' :
                *(out_arr+out_arr_counter) = inp_arr[i];
                out_arr_counter++;
                break;
            case 'u' :
                *(out_arr+out_arr_counter) = inp_arr[i];
                out_arr_counter++;
                break;
            default :
                break;
        }
    }
    *(out_arr+out_arr_counter+1) = '\0';
    return out_arr;
 }

不幸的是它没有输出: aou ,而是随机的ASCII值,我做错了什么?

2 个答案:

答案 0 :(得分:2)

主要问题是您从未为out_arr分配空间,您需要使用malloc()进行分配。

当你分配空终止符时,你也被1点关闭,因为out_arr_counter已经在循环中递增了。

由于您的所有开关案例都做同样的事情,您可以将它们组合起来。

char * get_vow(char *inp_arr,int arr_size){
    int i,out_arr_counter = 0;
    char * out_arr = malloc(arr_size + 1);
    for(i = 0;i<arr_size;i++){
        switch(tolower(inp_arr[i])){
        case 'a' :
        case 'e' :
        case 'i' :
        case 'o' :
        case 'u' :
            out_arr[out_arr_counter++] = inp_arr[i];
            break;
        default :
            break;
        }
    }
    out_arr[out_arr_counter] = '\0';
    return out_arr;
}

答案 1 :(得分:1)

问题是out_arr未初始化。

您可以使用两种解决方案:

  • out_arr初始化为动态分配的内存块,或
  • out_arr作为指向调用者预分配存储的指针

第一个选择需要调用者free结果;第二种选择是让调用者将指针传递给本地存储,并完全避免动态分配。

注意: switch中的所有案例都做同样的事情,因此您可以合并他们的代码,如下所示:

switch(tolower(inp_arr[i])){
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        out_arr[out_arr_counter++] = inp_arr[i];
        break;
}

还要注意使用索引表达式out_arr[out_arr_counter]代替指针解引用表达式。这会产生更一致的代码。