iT邦幫忙

0

使用函式回傳字串 [C語言]

題目簡介:
1.試寫一函式char* copystr(int n, const char *str),將str字串複製n次後回傳。
2.使用main()函式呼叫,呼叫敘述dupstr = copystr(n,srcstr);
3.印出dupstr。

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

//char a[80];

char* copystr(int n, const char *str){
   int k = strlen(str);
   char space[] = " ";
   static char a[80];
   strcpy(a,str);
   for(int i = 1; i < n; i++){
      strcat(a,space);
      strcat(a,str);}
   return a;
}

void main(void){
   int n = 4;
   char srcstr[] = "hello";
   char *dupstr = copystr(n,srcstr);
   puts(dupstr);
}

詢問,在函式內回傳字串:
1.定義於全域變數
2.使用靜態修飾變數static
才能確保函式結束時,字串資料不會被消除?有其他比較好的方法嗎?

spider iT邦新手 5 級 ‧ 2021-07-05 13:24:01 檢舉
所以說,在C語言,要回傳字串還是只能用全域變數或靜態修飾宣告,強制將記憶體位置放置不會被free掉的地方。

否則在離開函式copystr()的時候就,宣告char *a會free掉, 回傳的位址指向的東西將是一串無意義的東西。
1
EN
iT邦研究生 2 級 ‧ 2021-07-05 01:15:26
最佳解答

使用 malloc 分配動態記憶體也是一種方法:

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

char* a;

char* copystr(int n, const char *str){
   int k = strlen(str);
   char space[] = " ";
   a = (char*)malloc((k*(n + 1))*sizeof(char));
   strcpy(a,str);
   for(int i = 1; i < n; i++){
      strcat(a,space);
      strcat(a,str);}
   return a;
}

void main(void){
   int n = 4;
   char srcstr[] = "hello";
   char *dupstr = copystr(n,srcstr);
   puts(dupstr);
   free(a) // to refrain memory leak
}
1
小魚
iT邦大師 1 級 ‧ 2021-07-04 17:40:34

都用了string,
為什麼還用char?
C++要用char處理變動長度的字串很麻煩.
用string就好了.

#include <iostream>
using namespace std;

string copystr(int n, string str)
{
	if (n <= 0)
		return "";
	if (n == 1)
		return str;
	return str + copystr(n - 1, str);
}

int main()
{
	int n = 4;
	string str = "hello";
	string str2 = copystr(n, str);

	cout << str2.c_str() << endl;

	system("pause");
}
spider iT邦新手 5 級 ‧ 2021-07-05 12:48:43 檢舉

用char的原因是,題目要求(汗...

小魚 iT邦大師 1 級 ‧ 2021-07-05 13:21:28 檢舉

那就把char後面那個數字加大一點吧,
(如果題目有說最大多少就照題目的就好)

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-07-04 17:57:30

這篇完全回答了你所有的問題
不妨參考參考

我要發表回答

立即登入回答