我是新的 c,我正在嘗試 sprintf 和指標。我在控制臺中得到的只是回傳 buf;請按原樣幫助我處理此代碼。
#include <stdio.h>
char* stringa(char* str);
int main()
{
char* ss = "123";
stringa(ss);
return 0;
}
char* stringa( char* str)
{
char buf [100] ;
sprintf(buf,"hello %s", str);
return buf;
}
我也嘗試了許多其他方法,例如 sprintf_c,并且我的計算機嚴重關閉。我正在學習 C.
uj5u.com熱心網友回復:
也許這就是你想要的
#include <stdio.h>
char* stringa(char* dest, char* src)
int main()
{
char buf [100] ;
char* ss = "123";
printf("%s\n", stringa(buf, ss));
return 0;
}
char* stringa(char* dest, char* src)
{
sprintf(dest,"hello %s", src);
return dest;
}
uj5u.com熱心網友回復:
在函式 'char* stringa(char* str)' 中,您沒有在堆中為 char 陣列 'buf' 分配空間,而是在堆疊上為該變數分配空間。(意思是在函式完成后,變數 'buf' 將被擦除,因為它將超出范圍)因此您必須要求編譯器為此陣列分配記憶體空間,我建議使用 malloc()
前任:
char* stringa( char* str)
{
char *buf = (char*)malloc(sizeof(char) * 100);
sprintf(buf,"hello %s", str);
return buf;
}
uj5u.com熱心網友回復:
char* stringa( char* str) { char buf [100] ; sprintf(buf,"hello %s", str); return buf; }
這段代碼的問題是,buf char陣列是本地的stringa功能。當函式回傳時,buf陣列占用的記憶體不再有效(例如,它可以在以后重用以存盤其他變數、陣列等的內容)。
所以當函式回傳時,你給呼叫者一個指向垃圾記憶體的指標,指向無效資料。C 編譯器正在嘗試幫助您處理該警告訊息;它告訴您:“抱歉,您正試圖將區域變數(即 buf 字符陣列)的地址傳回給呼叫者,該地址在函式終止時不再有效。”
為了解決這個問題,一種選擇是char在呼叫站點為輸出字串分配陣列,并讓被呼叫的stringa函式寫入呼叫者提供的陣列:
#include <stdio.h>
char* stringa(char* dest, const char* str);
int main()
{
const char* ss = "123";
char buf[100];
stringa(buf, ss);
return 0;
}
/* Write the final message into 'dest'.
* Return the same dest address.
*/
char* stringa(char* dest, const char* str)
{
/* Note: better using a safe string function
* to prevent buffer overflows (e.g. sprintf_s),
* passing the maximum destination array size as well.
*/
sprintf(dest,"hello %s", str);
return dest;
}
請注意,我還在const您的代碼中添加了一些s 以對只讀輸入字串強制執行一些常量正確性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337486.html
上一篇:如何從字串中提取所有整數并將它們存盤在java中的int陣列中
下一篇:從字串中洗掉引號空格
