如何将String作为参数传递,然后在C中返回String

时间:2014-03-29 15:30:34

标签: c string char return parameter-passing

我试图弄清楚如何将字符串作为参数传递,然后在C中返回另一个字符串。我只是通过添加测试来练习。这是一个项目,我被困在我需要对字符串进行一些验证的地方,并希望在单独的功能中进行。显然我的例子比它应该更复杂但我需要知道如何操作已作为参数传递的字符串然后将其作为另一个字符串返回。

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

void stringCopy(char *); 

int main()
{
    char delay;
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);


    char newString[20];

    strcat(newString, stringCopy(string));   
    printf("String: %s", newString);

     delay = getchar();
     delay = getchar();
     }

/*char stringCopy(char *str)
{
     char string2[20] = "test";

     strcat(string2, str);

     return string2;

}*/

char* stringCopy(char *str)
{
     char *string2 = malloc(sizeof(char)*20);

     strcpy(string2,"test");
     strcat(string2, str);

     return string2;

} 

以下是我的小练习计划的所有代码,提前感谢您的帮助。

**编辑以显示更改。我只是不知道如何在main()中访问新的(string2)。

edit2:我似乎无法得到它。我非常感谢大家的帮助。真的很沮丧。我将继续尝试,但我甚至不明白为什么我得到错误或如何在main()中访问我的新字符串。

edit3:我是个白痴,我的文件扩展名为.cpp,而不是.c。

3 个答案:

答案 0 :(得分:1)

stringCopy()的问题是string2只存在于函数内部。一旦到达最后的},对象就不再存在,并且从其他函数对它的任何引用都是错误的。

您需要传递结果指针(1)或返回指向某个对象的指针,该对象将在函数终止后继续生效(2)。

/* 1 UNTESTED */
void stringCopy(char *destin, size_t dlen, const char *source) {
    int n = snprintf(destin, dlen, "test%s", source);
    if (n >= dlen) /* error */;
}
int main(void) {
    char test[100];
    stringCopy(test, sizeof test, "foobar");
    printf("%s\n", test);
}

/* 2 UNTESTED */
char *stringCopy(const char *source) {
    int size;
    char *tmp;
    size = strlen(source) + 5;
    tmp = malloc(size);
    if (tmp) {
        int n = snprintf(tmp, size, "test%s", source);
        if (n != size - 1) /* error */;
    }
    return tmp;
}
int main(void) {
    char *test;
    test = stringCopy("foobar");
    printf("%s\n", test);
    free(test);
}

答案 1 :(得分:0)

您需要返回字符串,而不是字符。试试这个:

char* stringCopy(char *str)
{
     char *string2 = malloc(sizeof(char)*20);

     strcpy(strin2,"test");
     strcat(string2, str);

     return string2;

}

答案 2 :(得分:0)

有两种常见的方法来处理这种情况。您可以在堆上分配空间来保存新生成的字符串,或者您可以将另一个参数传递给函数,以告知它在哪里存储新字符串。

在堆上分配新字符串

char *stringCopy(char* src) {
    char* dst = malloc(strlen(src) + 4 + 1);
    strcpy(dst, "test");
    strcat(dst, src);
    return dst;
}

int main() {
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);
    char* newString = stringCopy(string);
    printf("String: %s", newString);
    free(newString); // important!
}

作为参数传入缓冲区

void stringCopy(char* src, char* dst) {
    strcpy(dst, "test");
    strcat(dst, src);
}

int main() {
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);
    char newString[20];
    stringCopy(string, newString);
    printf("String: %s", newString);
}

通常在传递缓冲区时,您也会传入缓冲区大小,以便函数可以正常失败而不是溢出缓冲区。