2015-09-12 34 views
2

當我按下鍵盤上的一個鍵(整數)時。它確實是這樣的:如何將gchar *轉換爲字符

gchar *keypressed; 
keypressed=gdk_keyval_name (event->keyval); 
printf("The KeyEvent is: %s\n", keypressed); // Till here it is fine  

我得到段錯誤當我這樣做:

char ch; 
sprintf(ch, "%s\n", keypressed); 
printf("The NewKeyEvent is: %s\n",ch); 

我需要轉換它作爲我打算在開關的情況下使用的值。沒有轉換它是不可能的。

+1

你的變量'ch'是*單個字符*它不能包含字符串或用作字符串。也許你想要一個*數組*的字符(例如'char str [32];')? –

+0

你能告訴我嗎?不管它是什麼,我需要存儲在** keypressed上的值**應該能夠在開關盒中使用。 – djgharphalia07

+0

@ djgharphalia07然後使用一個字符。但是'keypressed'有多長? – ameyCU

回答

2

gchartypedef別名char,所以問題不在於類型轉換。您需要爲sprintf緩衝區分配一些空間。

當前,您將單個未初始化的char傳遞到指針所在的位置。除了由未定義的行爲導致的段錯誤之外,您還應該從編譯器中收到警告。

爲了解決這個問題,使char秒的陣列,並將它傳遞到sprintf代替:

char ch[10]; 
sprintf(ch, "%8s\n", keypressed); 
printf("The NewKeyEvent is: %s\n", c); 

注8限制在sprintf。這是因爲ch的大小爲10,因此'\n''\0'需要兩個額外的點。

+2

「我需要將它轉換爲我要在開關盒中使用的值,不進行轉換是不可能的。」儘管如此,這並不能幫助您開關,因爲您無法開啓C字符串。你應該打開'event-> keyval'本身,它有一個整型,可以用作'switch'表達式。 – dasblinkenlight

+0

我已經轉換使用* atoi *,它現在工作正常... event-> keyval將很快使用:) – djgharphalia07

+0

當我按鍵盤上方的字母2。 event-> keyval *將它作爲分號50的char值。我應該怎麼做? – djgharphalia07

1

改爲使用ch[100]

int sprintf (char * str, const char * format, ...);

sprintf組成一個與如果格式是printf使用,將被打印的相同的文本,而是被印刷,所述內容被存儲在緩衝器中的C字符串由STR指出。

也就是說,當你調用sprintfch代替ch[100]sprintf認爲ch指針以釋放內存,並導致你的段錯誤。

這應該工作:

char ch[100]; 
sprintf(ch, "%98s\n", keypressed); 
printf("The NewKeyEvent is: %s\n", ch) 

%98s格式說明是因爲你必須要離開弦空終止和你的換行符額外的空間。

+0

我在你之前得到了答案......對不起,這是我可以給你的回報:) upvote! – djgharphalia07

1

如果只想從keypressed字符串的單個字符有兩種方式:

  1. 數組索引的使用,這樣你可以在字符串中訪問任何字符:

    char ch = keypressed[x]; // Where `x` is the character number you want 
    

    請記住,數組索引從零開始,因此字符串中的第一個字符是數字0

  2. 如果你想第一個字符,您也可以使用引用操作

    char ch = *keypressed; 
    

    這相當於

    char ch = keypressed[0];