簡體   English   中英

C-從char []創建const char *

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM