簡體   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