#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINES 25
int get_lines(char *studentinfo[]);
int main()
{
int onswitch=0;
char *studentinfo[100];
char *fname[100];
char *lname[100];
char *score[100];
int counter;
int x,y;
char temp,temp2,temp3;
counter=get_lines(studentinfo);
for (y=0; y<counter; y++)
{
temp=strtok(studentinfo, " ");
fname[y]=malloc(strlen(temp));
strcpy(fname[y],temp);
temp2=strtok(NULL, " ");
lname[y]=malloc(strlen(temp2));
strcpy(lname[y],temp2);
temp3=strtok(NULL," ");
score[y]=malloc(strlen(temp3));
strcpy(score[y],temp3);
int get_lines(char *studentinfo[])
{
int n=0;
char buffer[80];
puts("Enter one line at a time; enter a blank when done.");
while ((n<MAXLINES) && (gets(buffer) !=0) && (buffer[0] != '\0'))
{
if ((studentinfo[n]=(char*)malloc(strlen(buffer)+1))==NULL)
return -1;
strcpy(studentinfo[n++],buffer);
}
return n;
}
好吧,伙计们我正在尝试制作一个程序,接收学生信息以便以后分类。我已将输入向下移动到底部的功能。我试图将学生信息分解为三个不同的指针进行排序。我遇到的问题是尝试分配足够的内存来存储信息。然后实际将内存存储在该指针位置。
一个简单的输入是
John Smith 80
^fname ^lname ^score
我认为for循环我会在理论上工作,但它没有(错误:ConsoleApplication3.exe中0x0F3CFA50(msvcr110d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xFFFFFF8)任何人都可以指向正确的方向(不只是给我一个有效的循环)?
答案 0 :(得分:1)
通过实施,您将获得访问冲突。你正试图触摸一个肮脏的记忆区域。这是解决方案,下面有解释
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINES 25
int get_lines(char *studentinfo[]);
int main()
{
int onswitch=0;
char *studentinfo[100];
char *fname[100];
char *lname[100];
char *score[100];
int counter;
int x,y;
char *temp,*temp2,*temp3;
counter=get_lines(studentinfo);
for (y=0; y<counter; y++)
{
temp=strtok(studentinfo[y], " ");
fname[y]=malloc(strlen(temp));
strcpy(fname[y],temp);
temp2=strtok(NULL, " ");
lname[y]=malloc(strlen(temp2));
strcpy(lname[y],temp2);
temp3=strtok(NULL," ");
score[y]=malloc(strlen(temp3));
strcpy(score[y],temp3);
printf("%s %s %s", fname[y], lname[y], score[y]);
}
}
int get_lines(char *studentinfo[])
{
int n=0;
char buffer[80];
puts("Enter one line at a time; enter a blank when done.");
while ((n<MAXLINES) && (gets(buffer) !=0) && (buffer[0] != '\0'))
{
if ((studentinfo[n]=(char*)malloc(strlen(buffer)+1))==NULL)
return -1;
strcpy(studentinfo[n++],buffer);
}
return n;
}
首先,你的for循环和主要功能缺少一个结束括号}。所以加上那些。
你的getlines功能都很好。
你的for循环搞砸了。特别是,您混淆了传递的数据类型。请记住,您已经声明了一个POINTERS数组。
temp=strtok(studentinfo, " ");
这就是说,嘿,让我们对我的数组指针进行标记。你不想要这个。您想要标记该数组中的y
元素!因此,数组中的元素0是指向字符串&#34; JOHN SMITH 80&#34;的指针。这就是我们想要标记的内容。否则你所拥有的是试图沿着0xabcdabcd的行或任何分配的数组的内存地址标记的东西。
temp=strtok(studentinfo[y], " ");
这是正确的方法。它表示标记第一个元素,它是指向我们字符串的指针。
你的下一个问题是你的临时变量。你正在调用strlen(temp)。 strlen期望指向字符串的指针。您正在传递char本身的数据。实际上,您正在传递存储在char字节中的strtok函数的返回指针(可能为null)。
char temp,temp2,temp3;
您为char类型声明了三个字节。你想要的是三个char *来保存指向你的字符串标记的指针。
char *temp,*temp2,*temp3;
有了这个,strlen接受这些指针,为你的fname元素mallocs一些空间,然后你继续使用strcpy复制到这个元素。
注意:strcpy也有两个指针,一个用于目标,一个用于源,所以你的临时变量也需要指向你的字符串。
希望这有助于让我知道你是否对我的解释感到困惑。
答案 1 :(得分:0)
strcpy接受字符,直到达到\ 0字符。您想要检查strncpy或memcpy函数,然后手动添加null终止符。