C语言 函数,返回由输入中给定的两个字符串串联而成的字符串

ggazkfy8  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(150)

我的任务是编写一个C程序,接收输入的两个字符串(我可以在decleration期间决定它们的内容),并返回第三个字符串,即前两个字符串的连接。
此外,我还需要将第三个字符串的每个元音替换为星号"*"。
我遇到的主要困难是如何从一个接收两个字符串的函数中返回一个字符串。如果能纠正我的错误代码,我将不胜感激:)
下面是代码:

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

const char* concatvow (char *str1, char *str2);

int main()
{
    char word1[20]="One plus one ";
    char word2[20]="eqauls two";
    char *word3[20];
    
    concatvow(word1, word2);
    
    printf("%s", *word3);
    return 0;
}

const char* concatvow (char *str1, char *str2){

    char strfinal[20];
    int i=0;
    
    strcat(str1, str2);
    
    strcpy(strfinal, str1);
    
    if(strfinal[i]==65 || strfinal[i]==69 || strfinal[i]==73 || strfinal[i]==79 || strfinal[i]==85)            {
       strfinal[i]='*';
    }

return strfinal;
}

这是我的代码的输出。

main.c: In function ‘concatvow’:
main.c:33:8: warning: function returns address of local variable [-Wreturn-local-addr]
   33 | return strfinal;
      |        ^~~~~~~~

...Program finished with exit code 0
Press ENTER to exit console.
qjp7pelc

qjp7pelc1#

C语言中的任何变量都只能保存在一定范围内的内存中。正如前面的答案所述,您返回的内存不再属于该变量。您可以将堆内存与malloc一起使用。

char *strfinal = malloc (sizeof (char) * 20);
6tr1vspr

6tr1vspr2#

警告原因:
变量strfinalconcatvow()函数的局部非静态变量,一旦从concatvow()函数返回,该变量将停止存在。在其生存期之外对其进行任何访问都会导致未定义的行为。
代码中的一些其他问题:
1.检查concatvow()函数的此语句-

strcat(str1, str2);
  • 如果str1没有足够的空间来保存连接后的结果字符串,则会导致未定义的行为。
  • 即使str1有足够的空间,也会导致修改str1。这是故意的吗?
  • 如果将字符串常量传递给concatvow()函数而不是数组,则它将尝试修改字符串常量,这是不推荐的做法。

1.用'*'字符替换元音时,检查是否缺少小写元音。
处理所有这些情况:

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

const char * concatvow (const char *str1, const char *str2);

int main (void) {
    char word1[20] = "One plus one ";
    char word2[20] = "eqauls two";

    const char * word3 = concatvow (word1, word2);

    if (word3) {
        printf ("Result : %s\n", word3);
        free ((char *)word3);
    }
    
    return 0;
}

const char * concatvow (const char *str1, const char *str2) {
    if (!str1 || !str2) {
        // add error handling
        return NULL;
    }

    char * strfinal = malloc (strlen (str1) + strlen (str2) + 1); // +1 for null terminating character

    if (!strfinal) {
        // add error handling
        exit (EXIT_FAILURE);
    }

    // combine str1 and str2 and create one string
    sprintf (strfinal, "%s%s", str1, str2);

    // replace each vowel with a star symbol '*'
    for (char * p = strfinal; *p; ++p) {
        if (*p == 'A' || *p == 'a' ||
            *p == 'E' || *p == 'e' ||
            *p == 'I' || *p == 'i' ||
            *p == 'O' || *p == 'o' ||
            *p == 'U' || *p == 'u') {
            *p = '*';
        }
    }

    return strfinal;
}

输出:

# ./a.out
Result : *n* pl*s *n* *q**ls tw*

相关问题