[英]return a string from a function in C
我正在學習C,我想實現一個將字符串返回給主函數的函數。 我在這里閱讀了一些主題,但感到困惑。
#include <stdio.h>
#include <string.h>
char myPrint(int);
int main()
{
char msg[10];
msg = myPrint(1);
printf("\n %s \n", msg);
}
char myPrint(int n)
{
char msg[10];
if(n==1)
strcpy(msg, "ACCEPT");
else
strcpy(msg, "DENY");
return msg;
}
我得到了一堆警告和錯誤的。我讀這為的strcpy和有關這個話題很多其他環節的用法,但我沒有得到它..
聲明您的功能為
char *myPrint(int n);
不要從函數中返回局部變量msg
在myPrint
函數之后它不再存在。
if(n==1)
return "ACCEPT";
else
return "DENY";
永遠不要返回指向該函數中分配的變量的指針,因為到返回時,該變量將自動取消分配(與堆分配或靜態分配相反,它是堆棧分配的)。 因此,您可以將char *傳遞給myPrint並從其內部填充char數組。 然后,聲明了char數組的外部函數可以毫無錯誤地訪問它。 請注意,盡管下面的方法仍然不是最佳實踐,因為當一個指針傳遞到一個比“ ACCEPT” +1的長度短(+1表示終止\\ 0字符)的數組時,它允許緩沖區溢出。
void myPrint(char *msg, int n)
{
if (n == 1)
{
strcpy(msg, "ACCEPT");
}
else
{
strcpy(msg, "DENY");
}
}
int main()
{
char msg[10];
myPrint(msg, 1);
printf("\n %s \n", msg);
}
一點建議:在該字符串在函數中定義為局部變量時,返回指向該字符串的指針將不起作用,因為為該字符串分配的內存將無效。
根據示例,如果函數返回文字字符串,則必須按照Acme的說明進行 :
char *MyPrint (int n)
{
if (n==1)
return "ACCEPT";
else
return "DENY";
}
當您返回指向char的指針時,不能像在main()
那樣嘗試將該指針分配給數組。 您必須將其分配給必須也是char指針的變量:
int main()
{
char *msg;
msg = myPrint(1);
printf("\n %s \n", msg);
return 0;
}
如果需要將結果字符串復制到數組中,則必須使用strcpy()
(或更好的yer, strncpy()
),如下所示:
int main()
{
char msg[10];
strcpy (msg, myPrint(1) ); /* providing that your function won't ever return a string longer than 9 chars, or bad things will happen */
printf("\n %s \n", msg);
return 0;
}
聲明您的功能為
char *myPrint(char *ptr, int n);
從您的函數返回字符串。
從您的main
功能調用它
printf("\n %s \n", myPrint(msg, 1));
您的職能
char *myPrint(char *msg, int n)
{
if(n==1)
strcpy(msg, "ACCEPT");
else
strcpy(msg, "DENY");
return msg;
}
但是在這種情況下,不需要從函數返回字符串,因為它將更新main
的msg
數組。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STR_SIZE 10
char * myPrint(const int );
int main()
{
char *msg = NULL;
msg = myPrint(1);
free(myPrint(1));
printf("\n %s \n", msg);
return 0;
}
char * myPrint(const int n)
{
char *msg = (char *) malloc(STR_SIZE * sizeof(char));
if (n == 1)
strcpy(msg, "ACCEPT");
else
strcpy(msg, "DENY");
return msg;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.