如何检索用户输入值并将其存储到 C (JNI) 中的 jchar 数组?
How to retrieve user input value and store it to jchar array in C (JNI)?
预期输出
我想创建一个 Jchar 数组,数组的大小取决于用户输入的大小。
如何将输入值存储到jchar数组?
例如第一个输入是'A',第二个是'S'。
我想将值 'A' 存储到数组 [0] 并将 'S' 存储到数组 [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, 0, 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-language 的角度来看,这些的主要问题是 h
修饰符不适用于 %c
字段。但是您似乎更普遍地在 Java char
和 C char
之间的差异上挣扎。前者是 16 位无符号数据类型,通常被解释为包含 UTF-16 代码单元。后者是 8-or-more-bit(但可能是 8),maybe-signed 数据类型,其到抽象字符的映射是 (C-) 实现相关的。
如果我们可以做出以下简化假设
- 您的 C 实现使用 ASCII-compatible 运行时字符编码(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
数组,并根据输入的实际编码,通过适用的 Java 方法之一执行到 char 数组的适当转换,例如通过CharsetDecoder。当然,即使这两个假设都成立,您也可以这样做。
预期输出
我想创建一个 Jchar 数组,数组的大小取决于用户输入的大小。
如何将输入值存储到jchar数组?
例如第一个输入是'A',第二个是'S'。
我想将值 'A' 存储到数组 [0] 并将 'S' 存储到数组 [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, 0, 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-language 的角度来看,这些的主要问题是 h
修饰符不适用于 %c
字段。但是您似乎更普遍地在 Java char
和 C char
之间的差异上挣扎。前者是 16 位无符号数据类型,通常被解释为包含 UTF-16 代码单元。后者是 8-or-more-bit(但可能是 8),maybe-signed 数据类型,其到抽象字符的映射是 (C-) 实现相关的。
如果我们可以做出以下简化假设
- 您的 C 实现使用 ASCII-compatible 运行时字符编码(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
数组,并根据输入的实际编码,通过适用的 Java 方法之一执行到 char 数组的适当转换,例如通过CharsetDecoder。当然,即使这两个假设都成立,您也可以这样做。