c语言中的文件处理和标记化

c语言中的文件处理和标记化,c,file,token,tokenize,C,File,Token,Tokenize,我试图做的是从标准输入中获取以下格式的输入 输入: 22 |主题1 | 45 23 |受试者2 | 52 22 |受试者2 | 51 26 |科目1 | 72 23 |主题2 | 61 26 |科目1 | 81 那只不过是 学生ID |科目|分数 现在我想标记这些细节,并将它们存储在结构变量中,以便对它们进行计算。此代码不起作用。最后一行中的printf给出了5 0作为输出,这是不正确的。请帮忙。 struct学生 { int-sid; char sub[35]; 整数标记; }; voi

我试图做的是从标准输入中获取以下格式的输入

输入:

22 |主题1 | 45
23 |受试者2 | 52
22 |受试者2 | 51
26 |科目1 | 72
23 |主题2 | 61
26 |科目1 | 81
那只不过是 学生ID |科目|分数 现在我想标记这些细节,并将它们存储在结构变量中,以便对它们进行计算。此代码不起作用。最后一行中的printf给出了5 0作为输出,这是不正确的。请帮忙。

struct学生
{
int-sid;
char sub[35];
整数标记;
};
void main()
{
结构学生标准[16];
int i,ch,j;
煤焦温度[50];
文件*fp;
clrsc();
//fp=fopen(“xyz.txt”,“r”);
//fscanf(fp,“%s”,温度);
//printf(“\n%s”,temp);
i=0;
标准[i].sid=0;
while((ch=getchar())!=EOF&&i<6)
{
标准[i].sid=10*std[i].sid+(int)(ch-'0');
而((ch=getchar())!=“|”)
{
标准[i].sid=10*std[i].sid+(int)(ch-'0');
}
而((ch=getchar())!=“|”)
{
std[i].sub[j++]=ch;
}
std[i].sub[j]='\0';
标准[i]。分数=0;
而((ch=getchar())!='\n')
{
标准[i].sid=10*std[i].marks+(int)(ch-'0');
}
i++;
如果(i<6)
标准[i].sid=0;
}
printf(“%d%s%d”,标准[0].sid,&(标准[1].sub[0]),标准[2].marks);
//fclose(fp);
getch();
}

您应该使用库函数,而不是像这样手工操作

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct student
{
  int sid;
  char sub[35];
  int marks;
};


int main(void)
{
  struct student std[16];
  size_t i;
  size_t count;
  char   line[100];

  i          = 0;
  std[i].sid = 0;
  count      = sizeof(std) / sizeof(std[0]);
  while (((fgets(line, sizeof(line), stdin)) != NULL) && (i < count))
  {
    char *token;
    char *endptr;

    token = strtok(line, "|");
    if (token == NULL)
      continue;        
    std[i].sid = strtol(token, &endptr, 10);
    if (*endptr != '\0')
      continue;

    token = strtok(NULL, "|");
    if (token == NULL)
      continue;
    /* WARNING: no bound checking is being performed, DANGER ... */
    strcpy(std[i].sub, token);

    token = strtok(NULL, "|");
    if (token == NULL)
      continue;
    std[i].marks = strtol(token, &endptr, 10);
    if (*endptr != '\0')
      continue;

    ++i;
  }
}
#包括
#包括
#包括
结构学生
{
int-sid;
char sub[35];
整数标记;
};
内部主(空)
{
结构学生标准[16];
尺寸i;
大小/数量;
字符行[100];
i=0;
标准[i].sid=0;
计数=sizeof(标准)/sizeof(标准[0]);
而(((fgets(line,sizeof(line,stdin))!=NULL)和&(i
您的代码经过几次修复后运行良好

  • 填充主题后,将
    j
    重置为
    0
  • 您在计算标记时使用了
    std[i].sid
    而不是
    std[i].marks
要在末尾打印所有数据,请执行以下操作:

for (i = 0; i < 6; ++i)
    printf("%d %s %d\n", std[i].sid, &(std[i].sub[0]), std[i].marks);
使用您的数据进行输出:

22 Subject 1 45
23 Subject 2 52
22 Subject 2 51
26 Subject 1 72
23 Subject 2 61
26 Subject 1 81

它在Linux下使用
gcc
进行了很好的编译,在代码列表的顶部添加了一些内容。

它是
int main()
而不是
void main()
。我正在使用一个支持void main的旧编译器。顺便说一下,即使我将其设为int并在endYes中返回0,问题仍然是一样的。这与问题无关,您是否可以使用
string.h
标题?和
&std[1].sub[0]
->
std[1].sub
,是一样的。为什么最后一行对结构数组下标有不同的索引?@iharob是的,我可以使用strtok(),但我不能使用它,而且我在使用的方法上遇到了问题。。。我已经尝试过std[1].sub,但由于这不起作用,我一直在更改代码,甚至我尝试在文件上应用相同的方法,使用getc代替gatchar(您可以在注释中看到文件hanling语句)。这也带来了同样的问题。谢谢。这肯定对我有帮助。但是如果你告诉我我的代码出了什么问题,我将了解getchar()的正确用法,并构建我的概念如果你使用
getchar()
好的,问题出在
printf()
语句本身的某个地方。我只是试图打印结构内容。printf应该只打印该结构真正包含的内容是。但可能是
printf(“%d%s%d”,标准[0]。sid,标准[0]。sub,标准[0]。标记)是你真正想要的。你确定吗?您只做了两个更改?我刚刚添加了
j=0
并修复了
std[i].marks
位(第二个while循环将标记分配给
sid
而不是
marks
)。唯一的其他更改是注释掉
getch()
,因为我没有
conio.h
,添加了
#include
,并为
clrsc()
添加了一个垫片(可以注释掉)。当然,只需对您的代码和我发布的代码执行
diff
。我还在末尾添加了
for
循环,以打印所有结果。
22 Subject 1 45
23 Subject 2 52
22 Subject 2 51
26 Subject 1 72
23 Subject 2 61
26 Subject 1 81