C - 如何将strtok()返回的标记存储到一个char指针数组中?

时间:2018-03-13 14:29:02

标签: c string parsing

我有一个字符串指向从文本文件中取出的字符串,我希望逐行拆分并存储到数组中。我的代码在这里:

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时会出现问题。任何帮助将不胜感激。

2 个答案:

答案 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);