fgets()在多次使用时崩溃C程序

时间:2015-12-09 09:37:45

标签: c crash fgets

我声明了一个数组,并填充了3个字符串(数学,物理,英语)。我使用fgets()来获取要添加到数组的新主题,这很正常。但是,每当我复制相同的代码块以从用户那里获得另一个主题时,程序就会崩溃。

为什么会这样?如何从用户获取字符串并将其添加到数组?

@Override
public View getGroupView(final int groupPosition, boolean isExpanded,View convertView, final ViewGroup parent) {
   if (convertView == null) {
     LayoutInflater infalInflater = (LayoutInflater)this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     convertView = infalInflater.inflate(R.layout.row_list_header,null);
 }
CheckBox chkGroup = (CheckBox) convertView.findViewById(R.id.chkGroup);
chkGroup.setOnClickListener(new OnClickListener() {
     public void onClick(View v) {
        CheckBox cb = (CheckBox) v.findViewById(R.id.chkGroup);
        if (cb.isChecked()) {
           privateGroupChecked.set(groupPosition, true);
        else  {
           privateGroupChecked.set(groupPosition, false);
         }
         notifyDataSetChanged();
       }
    });
  return convertView;
}

@Override
public View getChildView(final int groupPosition,final int childPosition, boolean isLastChild, View convertView,ViewGroup parent) {if (convertView == null) {
    LayoutInflater infalInflater = (LayoutInflater)this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = infalInflater.inflate(R.layout.row_list_child, null);
    }
    boolean isGroupChecked = privateGroupChecked.get(groupPosition);
    if (isGroupChecked) {
    chkDevice.setChecked(isGroupChecked);
     }
     else
     {
       chkDevice.setChecked(!isGroupChecked);
     }
     return convertView;
    }

3 个答案:

答案 0 :(得分:2)

请注意,subjectNamechar*类型的数组。 您的前3个字符串是静态定义的。 对于您希望通过fgets()获取的字符串,您需要先使用mallaoc分配内存,然后再调用fgets()

类似的东西:

subjectName[numOfSubj] = (char *) malloc(50*sizeof(char));
fgets(subjectName[numOfSubj], 50, stdin);

最后不要忘记free分配的内存。 请注意,您可能需要考虑不同的方法。您可以静态定义数组:char subjectName[1000][50]并使用strcpy()用“Math”,“Physics”和“English”填充它。

答案 1 :(得分:2)

你有一个1000个指针的数组,但与这个问题相关的指针并没有指向任何东西。在调用malloc之前,你需要fgets一些内存用于指针,例如

printf("Enter new subject name: ");
subjectName[numOfSubj] = malloc( 50 );
fgets(subjectName[numOfSubj], 50, stdin);

答案 2 :(得分:2)

它在第一种情况下正在工作,因为您正在使用主题名称初始化char数组,因此编译器会分配内存。

在USER情况下,您需要在从用户那里获取输入之前分配内存。

  

fgets(subjectName [numOfSubj],50,stdin); //这里你传递了null char   阵列

所以要避免错误

subjectName[numOfSubj] = malloc( 50 ); //memory allocation

 fgets(subjectName[numOfSubj], 50, stdin);
每当你完成它的使用时,

free内存(由malloc分配)。

free(subjectName[numOfSubj] );