如何将gchar *转换为char

时间:2015-09-12 09:20:15

标签: c netbeans char gtk key-events

当我按下键盘上的一个键(整数)时。它的确如下:

 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);

我需要转换它,因为我将使用 switch case 中的值。没有转换就不可能。

3 个答案:

答案 0 :(得分:2)

typedefchar的{​​{1}}别名,因此问题不在于类型转换。您需要为sprintf缓冲区分配一些空间。

目前,您正在将一个未初始化的char传递给指针所在的位置。除了由未定义的行为引起的段错误之外,您还应该从编译器收到警告。

要解决此问题,请制作一个char的数组,然后将其传递给sprintf

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

请注意sprintf中的限制为8。这是因为ch的大小为10,我们需要为'\n''\0'添加两个额外的位置。

答案 1 :(得分:1)

改为使用ch[100]

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

sprintf使用与printf上使用的格式相同的文本组成字符串,但内容在缓冲区中存储为C字符串而不是打印str。指出。

也就是说,当您使用sprintf而不是ch致电ch[100]时,sprintf认为ch指针释放内存并导致你的段错误。

这应该有效:

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

%98s格式说明符是因为你必须为字符串null-terminator和换行符留出额外的空间。

答案 2 :(得分:1)

如果您只需要keypressed字符串中的单个字符,则有两种方法:

  1. 使用数组索引,这样您就可以访问字符串中的任何字符:

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

    请记住,数组索引从零开始,因此字符串中的第一个字符是数字0

  2. 如果你想要第一个字符,你也可以使用解除引用操作符

    char ch = *keypressed;
    

    这相当于

    char ch = keypressed[0];