当我按下键盘上的一个键(整数)时。它的确如下:
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 中的值。没有转换就不可能。
答案 0 :(得分:2)
typedef
是char
的{{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
字符串中的单个字符,则有两种方法:
使用数组索引,这样您就可以访问字符串中的任何字符:
char ch = keypressed[x]; // Where `x` is the character number you want
请记住,数组索引从零开始,因此字符串中的第一个字符是数字0
。
如果你想要第一个字符,你也可以使用解除引用操作符
char ch = *keypressed;
这相当于
char ch = keypressed[0];