所以目前我的程序使用这样的硬编码数组:
char *array[] = {"array","ofran","domle","tters", "squar"}
基本上是n个长度为n * n的网格的n个字符串。然后,我将这些值视为2D数组。因此,我将访问array [y] [x]并使用相应的ASCII进行比较运算和数学运算。>
我希望允许在程序中实现各种大小(n * n)(最多32个)的文本文件,而不是对其进行硬编码。但是在使用fgets时遇到问题。
我当前用于获取和存储文件信息的功能如下:
char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");
int n = 0;
while(fgets(buffer, 32, fp)){
array[i] = buffer;
n++;
}
fclose(fp);
,但是“ array”的所有值都相同(它们是最后一个字符串)。因此,使用上面的示例值。如果我将array [0]打印到array [4],我得到
我的代码中的值
squar
squar
squar
squar
squar
期望值:
array
ofran
domle
tters
squar
答案 0 :(得分:3)
给出以下代码:
char buffer[32];
有多少buffer
个变量?
一个。
这段代码
array[i] = buffer;
将char *
的每个array
元素指向 ONE buffer
。
(一种解决方法是将@Jabberwocky发布在他的答案中-使用strdup()
)
答案 1 :(得分:3)
array[i] = buffer
只是将完全相同的指针分配给array
的所有元素。您需要在此处动态分配内存:
char *array[32];
char buffer[32];
FILE *fp = fopen("textfile.txt","r");
int n = 0;
while(fgets(buffer, 32, fp)){
array[i] = strdup(buffer); // allocate memory for a new string
// containing a copy of the string in buffer
n++;
}
fclose(fp);
为简洁起见,此处不进行错误检查。另外,如果输入文件包含多于32行,您也会遇到麻烦。
如果您的平台上不存在strdup
:
char *strdup(const char *str)
{
char *newstring = malloc(strlen(str) + 1); // + 1 for the NUL terminator
if ( newstring )
strcpy(newstring, str);
return(newstring);
}
为简洁起见,这里也不再进行错误检查。
答案 2 :(得分:0)
public interface OnResponse{
void onResponse(JSONObject response) throws Exception;
void onErrorResponse(VolleyError volleyError);
}//OnResponse
public static void newRequest(Context context, String url, final Map<String, String>params, final OnResponse onResponse){
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RequestQueue queue = Volley.newRequestQueue(context);
//
//onErrorResponse()
//onResponse()
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, response -> {
// - - - - - - - - - - - - - - - - - - - - -
try {
JSONObject object = new JSONObject(response);
onResponse.onResponse(object);
} catch (Exception e) {
Log.e(TAG, "FLAG-1");
e.printStackTrace();
}
// - - - - - - - - - - - - - - - - - - - - -
}, error -> {
Log.e(TAG, "FLAG-2");
onResponse.onErrorResponse(error);
}){
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
volleyError.printStackTrace();
Log.e("zxc", volleyError.getMessage()+"");
Log.e("zxc", volleyError.getLocalizedMessage()+"");
return super.parseNetworkError(volleyError);
}
};
//
stringRequest.setParams(params);
stringRequest.setShouldCache(false);
queue.add(stringRequest);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}//newRequest()`
看看您的变量:第一个是32个char *指针的数组,第二个是32个char数组。 在while循环中,您也只需将数组中的每个元素分配给同一缓冲区。你有看到?尽管fgets只是不断刷新/更新具有最新数据的缓冲区。