问题描述
预期输出
-
我想创建一个Jchar数组,该数组的大小基于用户输入的大小。
-
如何将输入值存储到jchar数组?
-
例如,第一个输入为“ A”,第二个输入为“ S”。
-
我想将值'A'存储到array [0],将'S'存储到array [1]。
-
基于下面的代码,我无法将值存储到jchar数组。
代码:
JNIEXPORT jcharArray JNICALL Java_array_getArrayCharacter(JNIEnv *env,jobject obj){
int i,size;
jchar array[size];
//array size
printf("Enter Size of Array : ");
scanf("%d",&size);
//User input Character
printf("\n--User Defined Character--\n");
for (i = 0; i < size; i++) {
printf("Input %d: ",i+1);
scanf("%hc",&array[i]);
}
//Display array
for (i = 0; i < size; i++){
printf("%hc\n",array[i]);
}
//create new array with the given length
jcharArray result = (*env)->NewCharArray(env,size);
// update the new created array result
(*env)->SetCharArrayRegion(env,result,size,array);
return result;
}
解决方法
问题似乎围绕着这个……
for (i = 0; i < size; i++) { printf("Input %d: ",i+1); scanf("%hc",&array[i]); }
...也许也是这样:
//Display array for (i = 0; i < size; i++){ printf("%hc\n",array[i]); }
从C语言角度来看,这些语法的主要问题是h
修饰符不适用于%c
字段。但是,您似乎在为Java char
和C char
之间的差异而作更大的努力。前者是16位无符号数据类型,通常被解释为包含UTF-16代码单元。后者是一种8位或更多位(但可能是8位)的可能带符号的数据类型,其到抽象字符的映射取决于(C-)实现。
如果我们可以简化假设
- 您的C实现使用与ASCII兼容的运行时字符编码(UTF-8,Windows 1252或ISO 8859系列中的任何一个,等等),并且
- 您不需要支持超出7位ASCII范围的字符
则答案相对简单。您以类型(C)char
读取数据,然后通过隐式转换或强制转换在该数据和jchar
之间来回转换。例如,
for (i = 0; i < size; i++) {
char c;
printf("Input %d: ",i+1);
scanf("%c",&c);
array[i] = c; // implicit conversion across the assignment
}
for (i = 0; i < size; i++){
printf("%c\n",(char) array[i]); // explicit conversion via cast
}
注意:即使没有任何假设成立,这也可能会正确地将输入(C)字符回显到输出。
但是,如果以上假设中的任何一个都不成立,则您需要处理字符编码问题,以便Java将char数组解释为包含与C解释其输入表示的字符相同的字符。然后,您需要将输入读取到jbyte
数组中,并根据输入的实际编码,例如通过{{3},通过适用的Java方法之一将其转换为char数组。 }。当然,即使两个假设都成立,您也可以这样做。