0
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(void)
{
    int menuswitch=1;
    int amountofstudents;
    int fname[50];
    int lname[50];
    int grade[50];
    int i;
    char studentinfo[100];
    printf("Enter Amount of Students: ");
    scanf("%d", &amountofstudents);
    for (i=0;i<amountofstudents;i++)
    {
        gets(studentinfo);
        strcpy(fname[i], strtok(studentinfo, " "));
        strcpy(lname[i], strtok(NULL, " "));
        strcpy(grade[i], strtok(NULL, " "));
    }

好吧,需要一点使用 strtok。我正在尝试存储输入字符串的片段以供以后排序。我正在考虑使用 strtok 来断开字符串,然后将每个部分放在相应的数组中。然而,每次我尝试时,我都会在 Visual Studios 中收到一个错误,说访问冲突。提前感谢您的帮助

错误是

First-chance exception at 0x5120F7B3 (msvcr110d.dll) in Lab 2.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x5120F7B3 (msvcr110d.dll) in Lab 2.exe: 0xC0000005: Access violation reading location 0x00000000.

输入将是

FirstName Lastname 80(Grade)
4

3 回答 3

1

一个主要问题是您尝试复制到整数值而不是字符串。将整数数组更改为字符串数组:

...
char fname[50][100];
char lname[50][100];
char grade[50][100];
...

您的函数也有问题gets(除了它已被废弃且不应使用),即前一个scanf不会从输入缓冲区中删除换行符,因此第一次gets调用将看到这个空换行符并给您一个空行(您不检查)。

这可以通过scanf在格式字符串之后添加一个空格来告诉丢弃尾随空格来解决"%d"

scanf("%d ", &amountofstudents);
/*       ^    */
/*       |    */
/* Note space */

而不是gets,您应该使用fgets

fgets(studentinfo, sizeof(studentinfo), stdin);

最后,始终检查错误!

于 2013-10-15T05:21:45.660 回答
0

一个潜在的问题是scanf/gets combo. 改为使用并在适当的时候转换fgets()整数atoi()

char* token = strtok(studentinfo, " ");
if ( strlen(token) < sizeof(fname[i]) )
{
  strcpy(fname[i], token);
...

您还已将您的字符串声明为整数数组,它们应该是 char 例如char fname[50];

于 2013-10-15T05:07:46.453 回答
0

您遇到的问题是您已将三个变量(fname、lname 和grade)声明为 char[](数组)(嗯,这就是您要使用的类型),但您想提示并保留一堆的学生信息。然后您尝试从 strtok() 复制到您想要成为 char[] 的内容,但是由于您取消引用 fname[i] (lname[i],grade[i]),它们是 char 类型,而不是 char []。

您将需要 stdlib.h 退出,

#include <stdio.h>
#include <stdlib.h> //for exit
#include <string.h>
//#include <math.h> //you don't need this, yet
#define STUDLIMIT (100)

您可以创建一个 fname[]、lname[]、grade[] 数组(参见此处:http ://www.cs.swarthmore.edu/~newhall/unixhelp/C_arrays.html ),

int main(void)
{
    //int menuswitch=1; //you aren't using this
    int amountofstudents;
    char studentinfo[100];
    char fname[STUDLIMIT][50];
    char lname[STUDLIMIT][50];
    char grade[STUDLIMIT][50];
    int ndx;
    printf("Enter Amount of Students: ");
    if( (fscanf(stdin,"%d ", &amountofstudents)<=0)
    || (amountofstudents<1) || (amountofstudents>STUDLIMIT) )
    {
        printf("need %d to %d studends\n",1,STUDLIMIT); exit(0);
    }
    for (ndx=0;ndx<amountofstudents;ndx++)
    {
        printf("Student: "); fflush(stdout);
        fgets(studentinfo,sizeof(studentinfo),stdin);
        strcpy(fname[ndx], strtok(studentinfo, " "));
        strcpy(lname[ndx], strtok(NULL, " "));
        strcpy(grade[ndx], strtok(NULL, " "));
    }
}

或者您可以创建一个 struct(ure) 来保存输入的学生信息,并实例化这些学生记录的数组,为您输入和存储的每个学生创建一个数组,

typedef struct student
{
    char fname[50];
    char lname[50];
    char grade[50];
} StudentObj;
int StudentCopy(StudentObj*sp,char*fname,char*lname,char*grade)
{
    if(!sp || !fname || !lname || !grade ) return -1;
    strcpy(sp->fname, fname);
    strcpy(sp->fname, lname);
    strcpy(sp->fname, grade);
}
StudentObj students[STUDLIMIT];
int main(void)
{
    //int menuswitch=1; //you aren't using this
    int amountofstudents;
    char studentinfo[100];
    char fname[50];
    char lname[50];
    char grade[50];
    int ndx;
    printf("Enter Amount of Students: ");
    if( (fscanf(stdin,"%d ",&amountofstudents)<=0)
    || (amountofstudents<1) || (amountofstudents>STUDLIMIT) )
    {
        printf("need %d to %d studends\n",1,STUDLIMIT); exit(0);
    }
    for (ndx=0;ndx<amountofstudents;ndx++)
    {
        printf("Student: "); fflush(stdout);
        fgets(studentinfo,sizeof(studentinfo),stdin);
        strcpy(fname, strtok(studentinfo, " "));
        strcpy(lname, strtok(NULL, " "));
        strcpy(grade, strtok(NULL, " \n\r"));
        StudentCopy(&(students[ndx]),fname,lname,grade);
    }
}
于 2013-10-15T05:47:56.890 回答