如何将gchar*转换为char

3
当我在键盘上按下一个数字键时,它会执行以下操作:
 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中使用该值。如果不进行转换,则无法实现。


1
您的变量ch是一个单个字符,它不能包含字符串或用作字符串。也许您想要一个字符数组(例如char str[32];)? - Some programmer dude
你能给我展示一下吗?无论是什么,我需要在switch case中使用存储在keypressed上的值。 - djgharphalia07
@djgharphalia07 然后使用一个单字符。但是这里的 keypressed 有多长? - ameyCU
@user3121023,使用keypressed的效果和使用其他方法是一样的,不是吗? - djgharphalia07
让我们在聊天中继续这个讨论 - djgharphalia07
显示剩余2条评论
2个回答

2
char的一个typedef别名,因此问题不在于类型转换。你需要为缓冲区分配一些空间。

目前,你正在将单个未初始化的char传递到应该是指针的位置。除了由未定义行为引起的段错误外,编译器应该会发出警告。

要解决这个问题,可以创建一个char数组,并将其传递给sprintf

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

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

2
我需要将它转换,因为我将在 switch case 中使用该值。如果不进行转换,则无法实现。但这并不能帮助你使用 switch,因为你不能在 C 字符串上进行 switch。你应该直接在 event->keyval 上进行 switch,它具有整数类型,并且可以用作 switch 表达式。 - Sergey Kalinichenko
我已经使用 atoi 进行了转换,现在它运行良好... event->keyval 很快就会被使用 :) - djgharphalia07
当我从键盘上面的字母按下2时。事件 - > keyval会将其作为十进制数值50的char值。我该怎么办? - djgharphalia07
@djgharphalia07 这不是它应该做的吗? 十进制数50对应于ASCII中的字符'2' - Sergey Kalinichenko
1
@djgharphalia07 这取决于您想要用它做什么。如果您编写 switch(event->keyval) { case '0': ... break; case '1': ... break; case '2': ... break; ... default: }(请注意数字周围的单引号),则会根据数字值而不是其代码进行切换。 - Sergey Kalinichenko
显示剩余2条评论

1
如果您只想从“keypressed”字符串中获取单个字符,有两种方法:
  1. Use array indexing, this way you can access any character in the string:

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

    Remember that array indexing starts from zero, so the first character in the string is number 0.

  2. If you want the first character, you can also use the dereference operator

    char ch = *keypressed;
    

    This equivalent to

    char ch = keypressed[0];
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接