所有数组元素在C中都是相同的fget?

时间:2019-03-15 10:26:03

标签: c arrays file

所以目前我的程序使用这样的硬编码数组:

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

3 个答案:

答案 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只是不断刷新/更新具有最新数据的缓冲区。