我是编程新手,我正在尝试学习链接列表.我决定通过编写一个简单的程序来试验链接列表,该程序将从文件中读取,一次一个字符,并将每个字符插入到链接列表中.然后我打印出链表.简单吧?好吧,也许不是,如果这是你第一次.我正在关注在线教程哦,如此仔细,但我的输出不是它应该是的.(程序编译并运行时没有错误或警告.我正在使用代码块.)我得到两个数字,而不是获取任何字符.
这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Tokens_read_in{
char character;
int number;
char whichOne[5];
struct Tokens_read_in* next;
}Tokens;
int main()
{
//declare variables
char c;
//create a struct for the array that will hold the tokens
Tokens* token_array;
token_array = malloc(sizeof(Tokens));
token_array->next = NULL;
//open the input file
FILE *ifp; //input file pointer
char *filename = "input.txt";
ifp = fopen(filename, "r");
if(!ifp){
printf("Error in opening '%s' for reading!", filename);
exit(0);
}
while(!feof(ifp)){
//prepare to read in file one character at a time
c = getc(ifp);
//create a struct for the current token that is read in
Tokens* current_token = token_array;
//let the current_token point to the beginning of token_array
current_token = token_array;
//let the current_token point to the LAST of token_array
while(current_token->next != NULL){
current_token = current_token->next;
}
//create a node at the end of token_array
current_token->next = malloc(sizeof(Tokens));
//move the current_token to the last (new) of token_array
current_token = current_token->next;
if(current_token == NULL){
printf("Out of memory");
exit(0);
}
//plug character into current_token
current_token->next = NULL;
//letter
if(isalpha(c)){
printf("%c", c);
current_token->character = c;
strcpy(current_token->whichOne, "char");
}
//number
else if(isdigit(c))
{
printf("%d", (int)c);
current_token->number = (int)c;
strcpy(current_token->whichOne, "num");
}
//space
//this does not need to go into the token array
else if (c == ' '){
printf(" ");
}
//newline
//this does not need to go into the token array
else if (c == '\n'){
printf("\n");
}
//anything else
else if ((!isdigit(c) && !isalpha(c))){
printf("%c", c);
current_token->character = c;
strcpy(current_token->whichOne, "char");
}
//now that the current_token is plugged into token_array, free current_token
free(current_token);
}//end while(!feof(ifp))
//print the token_array
Tokens* conductor;
conductor = token_array;
while(conductor != NULL){
if(strcmp(conductor->whichOne, "num")){
printf("%d ", conductor->number);
}
else if(strcmp(conductor->whichOne, "char")){
printf("%c ", conductor->character);
}
conductor = conductor->next;
}
//done printing, so free conductor
free(conductor);
//done with program, so free token_array
free(token_array);
//close input file
fclose(ifp);
return 0;
}//end main
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的输入文件(名为input.txt):
<I don't know why every beginner program says hello world,
but hello world anyway.>
Run Code Online (Sandbox Code Playgroud)
我非常感谢任何看过这个并指出我正确方向的人.
您不应该在读取循环结束时释放current_token.这将导致问题,因为您释放了链接列表中的节点的内存.
另外,作为附注,当给定表示数字的字符时,isdigit会成功,因此例如字符"1".您应该仍然使用%c来打印出来,因为%d会为您提供字符"1"的ascii编号.