English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

以下是我的程式,
要求執行結果:Hello World
當然有很多辦法輸出"Hello World",但是我想知道如何使一個 function return 整個字串(char array)

#include
#include
char function(char x[]);
main(){
char input[80], output[80];
strcpy(input,"Hallo");
output=function(input);
printf("%s",output);
}
char function(char x[]){
char text[80];
strcpy(text,x);
strcat(text,"World");
return text;
}

2006-10-23 16:01:40 · 7 個解答 · 發問者 Anonymous in 電腦與網際網路 程式設計

其实我要编写两个程式,
一个是Convert string to int
另一个是Convert int to string

第一个很简单地完成了,因为return int 没有问题。我可以直接使用int=ConvertToInt(string);

2006-10-24 21:00:34 · update #1

第二个就遇到麻烦,因为之前我不懂得如何return 字串,修改了半天还是不满意,只懂得两种方法∶一就是一个“字元”一个“字元”的回传;另一个就如Pablo Picasso.G 说的call by reference,因此我无法做到
string=ConvertToString(Int);
(我要求两个function的一致性,要么都不Return否则一起Return)

2006-10-24 21:01:15 · update #2

首先非常感谢Anders Hejlsberg,他告诉我return的方法。同时也非常感谢各位给于的意见。Dynamic Memory Allocation 我从来都没用过(刚入门),还有none所说的multithread 我完全不懂 。看来我懂的还不及你们的十分之一,回去还要练多几年。。。

2006-10-24 21:03:29 · update #3

7 個解答

#include
#include

char* function(char x[]);
int main(){
char input[80], output[80];
strcpy(input,"Hallo");
strcpy(output,function(input));
printf("%s",output);

system("pause");
}


char* function(char x[]){
static char text[80];
strcpy(text,x);
strcat(text,"World");
return text;
}

static char text[80]; // 加上static 做法才是OK的
char text[80] ; 離開function 後該陣列記憶體被回收, 原本陣列記體內的值可能會被改寫 ... 所以單單用指標回傳此陣列位址不正確作法 .... 此記憶體空間算是無效的

謝謝

2006-10-23 17:13:19 · answer #1 · answered by ? 1 · 0 0

就算不是在multithread 下里的第二個程式還是會有問題.
1. static char *text;
沒有初使為NULL 下面的
delete []text; 可能會出問題
2. 回傳 text 因在function 中被保流起來. 下次呼叫function 會把text free 掉. 要是回傳的資料還別的用途就會出問題.

2006-10-24 05:29:19 · answer #2 · answered by SiYu 5 · 0 0

雖然「里」說出 Anders Hejlsberg 程式 static char text[80]; 的缺點, 但是「里」的程式也有問題:
只要是 static data 遇到 multithread 時,就有機會出問題

不過,已經是很不錯寫法!!

2006-10-24 10:53:02 補充:
To 心冷
內建型別的 static , global var 在 C++ 有保證為 0, 因此不是問題(但是對於變數,加上初始值才能避免「不必要的問題產生」, 因此這個問題算是「撰寫程式的問題」), 要說問題的話, 版主要的是 C 語言 ^_^

第二點非常同意

2006-10-23 18:32:02 · answer #3 · answered by none 4 · 0 0

但是我想知道如何使一個 function return 整個字串?
因為看到他用了 return 這個字眼XD

請問你是說這樣嗎?

void function(char x[]){
char text[80];
strcat(x,"World");
}

2006-10-23 22:13:05 補充:
原來小題目也是很深奧的@@.

2006-10-23 18:00:58 · answer #4 · answered by adam! 5 · 0 0

這一題只有表面看起來簡單,
能夠回傳整個字串的方法只有一種,就是定一個類,然後重載運算子,
讓它使用運算子時呼叫重載的運算子函數去複製資料。
一般常聽到的用function回傳整個字串char array,那全部都是騙人的,
不知道謠言是從哪傳出來的,被騙的人通常都會像你這樣寫,
事實上那種回傳字串的原理是因為宣告的矩陣是"連續"的,所以回傳
的是矩陣的第一個位址,因為是連續的所以只須要第一個位址,"但是",
output=function(input);和return text;
在跑完函數後,會被電腦看成output=text;
text這個位址當然是在,但是後面連續80個資料只能存活在函數裡,函數執行完
跳回主程式後text[80]已經死了,output接到的也只是屍體。
以下介紹兩個最簡單的用法:
//--1-------------------
像strcpy一樣只接傳入一個要拿來改的位址
char function(char *Destination,const char *Source){
........
return Destination;
}
雖然就算沒有回傳Destination,一樣可以得到結果,但有回傳的話比較靈活。
len = strlen(function(stra,strb,));
//--2-------------------
使用動態
char function(char *x)
{
static char *text;
delete []text;
text=new char[strlen(x)+strlen(World)+1];
strcpy(text,x);
strcat(text,"World");
return text;
}
如果使用static char text[80];的話便會有長度夠不夠,佔的空間,使靈活度下降
總之,位址雖然在,裡面的資料不見得在或是連續。

2006-10-23 23:39:04 補充:
錯很多啊,彳~~,我按太快了..
不不,其實是故意打錯的,嗯嗯≧﹏≦

2006-10-23 17:34:39 · answer #5 · answered by ? 4 · 0 0

為什麼不用Call by Reference的技巧去寫??用static的話,當程式compile產生的執行檔好像會變得比較大,因為程式在compile時,就為static配置記憶體空間(global也一樣);但不用static時,是當程式呼叫到這個function時,才為它配置。

2006-10-23 17:33:34 · answer #6 · answered by Pablo Picasso G. 4 · 0 0

有個小小的意見

text陣列是函式裡的變數

如果你把text位址回傳

函式結束,變成傳回的指標指向一個不是被系統分配使用的記憶體位址

執行可能沒問題,萬一這位址被其他程式使用了就會產生亂碼

在Dev c++裡也有產生
[Warning] address of local variable `text' returned
的訊息

2006-10-23 16:47:40 · answer #7 · answered by 沄™ 6 · 0 0

fedest.com, questions and answers