gpt4 book ai didi

c - 将指针 str 分解为更小的指针 str

转载 作者:行者123 更新时间:2023-11-30 15:43:40 24 4
gpt4 key购买 nike

#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)任何人都可以指出我正确的方向(不仅仅是给我一个有效的循环)?

最佳答案

通过您的实现,您会遇到访问冲突。您正试图触及内存的脏区域。这是解决方案,下面有解释

#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 循环和 main 函数缺少结束括号 } 。因此添加这些。

你的 getlines 功能很好。

你的for循环搞砸了。特别是,您混淆了传递的数据类型。请记住,您已经声明了一个指针数组。

 temp=strtok(studentinfo, " ");

这就是说,嘿,让我们标记我的数组指针。你不想要这个。您想要标记该数组中的第 y 个元素!因此数组中的元素 0 是指向字符串“JOHN SMITH 80”的指针。这就是我们想要标记化的内容。否则,您将尝试按照 0xabcdabcd 或分配的数组的内存地址来标记某些内容。

temp=strtok(studentinfo[y], " ");

这才是正确的做法。它说标记第一个元素,它是指向我们字符串的指针。

你的下一个问题是你的临时变量。您正在调用 strlen(temp)。 strlen 需要一个指向字符串的指针。您正在传递 char 本身的数据。实际上,您正在传递存储在 char 字节中的 strtok 函数的返回指针(可能为 null)。

char temp,temp2,temp3;

您为 char 类型声明了三个字节。您想要的是三个 char * 来保存指向字符串标记的指针。

  char *temp,*temp2,*temp3;

这样,strlen 接收这些指针,为您的 fname 元素分配一些空间,然后您继续使用 strcpy 复制到该元素中。

注意:strcpy 还需要两个指针,一个用于目标,一个用于源,因此您的临时变量再次需要是指向字符串的指针。

希望这有助于让我知道您是否对我的解释感到困惑。

关于c - 将指针 str 分解为更小的指针 str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com