给定一个文本文件:
I Angelina Jolie 1 7728323
I Mel Gibson 3 7809606 7733889 7724609
I Robert Redford 2 7721170 7731959
I Jennifer Aniston 4 2188989 2189898 2181020 2183456
I Jami Gertz 4 7734404 7774012 7773023 7921492
I Brad Pitt 2 7774017 7878485
R Sylvester Stallone 0
I Victoria Principal 3 7933045 7771234 7820987
R Jennifer Aniston 0
R Sean Penn 0
I Kevin Costner 1 7874014
Q
我需要读取每行,用空格分隔值,并创建每个值的结构体。我现在的代码是:
int main(){
int y;
FILE *data;
char action;
char line[100];
int counter = 0;
int index = 0;
struct number{
int phoneNumber;
struct number *next;
};
struct contact{
char fName[10];
char lName[10];
struct number *start;
};
struct number numbers[50];
struct contact directory[10];
if((data=fopen("hw6data.txt", "r")) != NULL){
while(fscanf(data, "%s", line) != EOF){
char s[2] = " ";
char *token;
token = strtok(line, s);
while(token != NULL){
if(counter==0){
if(s == "I") {
if(counter==1){
strcpy(directory[index].fName, s);
}
if(counter==2){
strcpy(directory[index].lName, s);
}
}
}
token = strtok(NULL, s);
}
}
}
for(y = 0; y < 10; y++){
printf("%s ", directory[y].fName);
printf("%sn", directory[y].lName);
}
fclose(data);
return 1;
}
我试图为每个电话联系人创建一个结构。I或R表示我是否应该插入或取出触点。该目录是一个数组,最多包含10个联系人。我总共能装50个数字。每个联系人结构体都包含一个指针,该指针指向数字结构体的numbers数组中的第一个数字。我正在创建一个基于数组的链表。我认为这段代码应该创建联系人结构。它可以编译,但是当我运行它时,我得到:
��f
�
ɷ�
�E
�����
�
��
.N=�
|�X�|���^�
�
Segmentation fault
帮助吗?
解析"I"行并输出所读内容的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int y;
FILE *data;
char action;
char line[100];
int counter = 0;
int index = 0;
struct contact{
char fName[10];
char lName[10];
};
struct contact directory[10];
if((data=fopen("hw6data.txt", "r")) != NULL){
while(fgets(line,sizeof(line),data)){
char s[2] = " ";
char *token = strtok(line, s);
while(token != NULL) {
if(strcmp(token,"I")==0) {
counter = 0;
}
if(counter==1) {
strcpy(directory[index].fName, token);
}
if(counter==2) {
strcpy(directory[index].lName, token);
index++;
}
counter++;
token = strtok(NULL, s);
}
}
}
for(y = 0; y < index; y++){
printf("%s ", directory[y].fName);
printf("%sn", directory[y].lName);
}
fclose(data);
return 1;
}
我一眼就能看到一些问题(不一定是完整的列表):
- 行
while (fscanf(data, "%s", line) != EOF)
一次不读取整行(这似乎是您的意图,因为您将变量命名为line
)。你可能想用while (fgets(data, 100, line) != NULL)
代替。 - 你不能做字符串比较在C作为
if (s == "I")
。如果您只是检查第一个字符,您可以执行if (s[0] == 'I')
(请注意,这里使用单引号(''
)表示字符字面量,而使用双引号("")
表示字符串字面量。 - 你有
if (counter == 1)
和if (counter == 2)
嵌套在if (counter == 0)
,所以这些条件永远不会为真,除非你修改counter
在if (counter == 0)
之后和if (counter == 1)
之前的某个点。 -
counter
和index
永远不会增加,所以你的整个while
循环对directory
数组没有任何影响。这就是为什么当你试图打印出它的值时,你会得到垃圾。