我有一个字符串指向从文本文件中取出的字符串,我希望逐行拆分并存储到数组中。我的代码在这里:
public static String[] parseDirections(String jsonData) {
JSONArray output = null;
JSONObject data;
try {
if (jsonData != null) {
data = new JSONObject(jsonData);
if (data.has("routes")) {
JSONArray routes = data.getJSONArray("routes");
if (routes.length() > 0) {
JSONObject route0 = routes.getJSONObject(0);
if (route0.has("legs")) {
JSONArray legs = route0.getJSONArray("legs");
if (legs.length() > 0) {
JSONObject legs0 = legs.getJSONObject(0);
if (legs0.has("steps")) {
output = legs0.getJSONArray("steps");
}
}
}
} else {
if (data.has("status") && data.getString("status").equalsIgnoeCase("ZERO_RESULTS") {
Toast.makeText(mcontext, "error", Toast.LENGTH_SHORT).show(); // NOW check
Log.d(jsonObject.getString("routes"), "error in code");
Log.d(TAG, "" + data.getString("status") + " error in code");
return null;
}
}
}
}
} catch (NullPointerException e) {
} catch (JSONException e) {
e.printStackTrace();
} finally {
if (output == null) {
return null;
}
return getPaths(output);
}
}
其中char * token;
char * unsplitLines[lines];
const char * s = "\n";
int i = 0;
while((token = strtok(rawFile, s)) != NULL)
{
printf("%s\n", token);
char * temp = malloc(20);
strcpy(temp, token);
unsplitLines[i] = temp;
free(temp);
rawFile = NULL;
i++;
}
表示文本文件中的每一行,而unsplitLines
是我尝试拆分的整个文本文件。每行最多15个字符,所以为了安全起见,我分配了20个字节。我可以正确地获取令牌,但是在尝试将其保存在rawFile
时会出现问题。任何帮助将不胜感激。
答案 0 :(得分:1)
基本上你不能存储指向临时存储的指针。
char * temp = malloc(20); // this is temporary
.
.
free(temp); // after this any pointer to temp buffer is invalid
解决方案:不要使用strcpy()。相反,直接在rawFile上操作并将指针存储到unsplitLines中。
char * token;
char * unsplitLines[lines];
const char * s = "\n";
int i = 0;
char* pointerForStrtok = rawFile;
while((token = strtok(pointerForStrtok, s)) != NULL)
{
pointerForStrtok = NULL;
printf("%s\n", token);
unsplitLines[i] = token;
i++;
}
答案 1 :(得分:1)
算法沿着这些方向发展。需要注意的是,strtok
第一个参数在第一次调用后必须为null。但是,split
方法效率低下,而strtok
应该是C中的首选方式。当您习惯java
&#39时,有点难以使用; s或C#
的拆分方法,但它有其特权。
char *str = "/some/path/i/want/to/split";
char *dup = strdup(str);
int i = 0;
char *split[32];
char *tok = strtok(dup, "/");
while (tok != NULL)
{
split[i++] = tok;
tok = strtok(NULL, "/");
}
// handle split before freeing dup
free(dup);