[英]C - Create const char* from char[]
這似乎很簡單,但是我是C語言的新手,找不到任何在線問這個問題的人。 我有一個用sprintf
設置的char[]
。 然后我需要從該char[]
創建一個const char*
。 這可能嗎,或者我需要玩弄我的類型嗎? 我需要使用const char*
才能進入MySQL查詢,但是我需要使用char[]
因為我需要使用sprintf
在結果中插入變量值。 這是代碼片段:
char sqlbuff[4096];
const char* sqlquery;
sprintf(sqlbuff, " %s %s ",
"SELECT idnum FROM idTbl WHERE idCol =", idVar);
sqlquery = &sqlbuff;
if ( mysql_query(con, sqlquery) )
{
finish_with_error(con);
}
我曾嘗試以多種方式設置const char
變量,但我總是遇到錯誤。 如果我對idVar
的值進行硬編碼並直接運行
mysql_query(con, "SELECT idnum FROM idTbl WHERE idCol = 1300)
它工作正常。 問題是我需要使用sprintf
來利用變量。 感謝所有幫助。
編輯:在HP-UX 11.11上運行
這行是錯誤的:
sqlquery = &sqlbuff;
sqlbuff
類型為char []
,因此獲取其地址會為您提供一個指向數組的指針 ,類型為char (*)[]
。 您只需要一個指向第一個char
(類型char *
)的指針,並且在大多數情況下評估數組的標識符都會得到這樣的指針(有一些例外,例如與sizeof
使用時)。 所以,只要寫
sqlquery = sqlbuff;
就是說,根本不需要單獨的指針變量。 sqlbuff
計算結果為char *
,並且指針可以隱式轉換為其const
限定的對應對象。 只需將sqlbuff
直接傳遞到需要const char *
位置,它將起作用。
應該提到另一件事,盡管它與您的問題沒有直接關系: 永遠不要使用字符串操作從用戶輸入構造SQL查詢 。 攻擊者可以通過這種方式輕松地注入自己的SQL代碼。 閱讀您的SQL客戶端庫的文檔,查找准備好的語句和參數綁定,並在需要將用戶輸入作為SQL查詢中的參數的任何地方使用此功能。
還有一個提示:如果您發現自己正在編寫類似
sprintf("%s", "foobar");
例如,您為%s
轉換提供了一個常量字符串,這是錯誤的。 只需將常量字符串作為格式字符串的一部分即可。
我需要從該
char[]
創建一個const char*
。
從您的代碼示例來看,您的意思似乎是您想要一個const char *
,它指向char[]
的內容。 這非常容易:
sqlquery = sqlbuff;
這是因為陣列型的值在幾乎所有的表達上下文被自動轉換為指針,因為它被允許非的值賦給const
類型到相應的一個可變const
-qualified類型。
而且,對於您顯示的內容,您甚至不需要該變量。 您可以僅將數組的標識符指定為mysql_query
的參數。 同樣適用於從數組到指針的自動轉換,這里,您可以合理地以其第二個參數的類型解釋const
限定符,以保證該函數不會嘗試修改指向的數據。
mysql_query(con, sqlbuf);
另一方面,您的嘗試
sqlquery = &sqlbuff; // wrong
生成錯誤類型的指針。 &sqlbuf
是指向數組的指針,而sqlquery
被聲明為指向char的指針。 指向char[]
的第一個char
的指針將指向與指向整個數組的指針相同的位置,但是兩者具有不同的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.