繁体   English   中英

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

[英]How to pass a String as a parameter and then return a String in C

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

    #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。

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

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

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

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

     return string2;

}

有两种常见的方法来处理这种情况。 您可以在堆上分配空间来容纳新生成的字符串,也可以向该函数传递一个附加参数,以告诉该函数将新字符串存储在何处。

在堆上分配新字符串

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

通常,在传递缓冲区时,您还将传递缓冲区大小,以便函数可以正常运行而不是使缓冲区溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM