我尝试实现的代码是一种读取.txt文件并将字符串转换为节点的方法。本质上,当我阅读.txt文件时,我首先检查非字母(单词不能以数字开头,单词的任何索引中也不能有非字母数字(。一旦找到第一个字母,程序就会退出循环并进入另一个循环,直到看到空格。当我成功制作一个单词时(当找到空格时,单词"结束"(,我将单词输入到链表中。
当我运行这个时,我收到一个总线错误:10。我以为这是由于单词[b]数组造成的,但是当我malloc它时,我仍然得到同样的错误。
提前谢谢你!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
struct Node{
char value[100];
int numOccur;
int numVariance;
struct Node *next;
};
void testprint(struct Node * head){
int data;
data = head->value;
strcpy(data,head->value);
while(head != NULL){
printf("%sn", data);
head = head->next;
}
}
int main()
{
struct Node *curr;
struct Node *n;
struct Node *head =0;
struct Node *tail =0;
struct Node *next;
char word[100];
int a;
int x;
FILE *file1;
file1 = fopen("test1.txt", "r"); //opens text file
if(file1 == NULL){
fprintf(stderr,"Error: Could not open file"); //if file1 has error, returns error message
exit(1);
}
a = fgetc(file1);
int b = 0;
while(a != EOF){
while(!isalpha(a)){
a = fgetc(file1);
continue;
}
n = (struct Node *) malloc( sizeof( struct Node));
while(isalnum(a)){
while( a != ' ' && a != EOF){
word[b] = a;
a = fgetc(file1);
b++;
}
word[b] = ' ';
}
n->next = 0;
if(head == 0){
head = n;
tail = n;
}
else{
tail->next = n;
tail = n;
}
}
testprint(head);
fclose(file1);
}
您应该注意编译器的警告。(最好始终使用 -Wall -Wextra
进行编译以获取更多警告。
正如Barney Hsiao所指出的,testprint()
是用FILE指针而不是Node指针调用的。
不相关,但如果您需要真常量和假常量,有一个标准的头文件将为您提供这些常量(小写,即。 true
,false
(。
#include <stdbool.h>
编译此代码时,我收到以下编译器警告:
$ CFLAGS="-Wall -Wextra" make bus10cc -壁挂式 -Wextra 总线10.c -o 总线10bus10.c:在函数"测试打印"中:bus10.c:20:14: 警告:从不兼容的指针类型赋值bus10.c: 在函数"main"中:bus10.c:48:8:警告:数组下标的类型为"char"bus10.c:54:8:警告:数组下标的类型为"char"bus10.c:68:23: 警告:从不兼容的指针类型赋值bus10.c:34:8: 警告:未使用的变量"x"bus10.c:31:17: 警告:未使用的变量"next"bus10.c:27:17: 警告:未使用的变量"curr"Bus10.c:74:1: 警告:控制达到非无效功能结束
现在其中一些比其他的更严重。"数组下标具有类型'char'"对我来说听起来不是问题(老实说,我什至不知道它是什么意思(。"未使用的变量"就是这个意思:你已经创建(声明(了一个变量,然后你永远不会使用它。"控制到达非 void 函数的末尾"意味着您有一个声明为返回值的函数,但代码在没有 Return 语句的情况下从底部掉下来。
但是"从不兼容的指针类型赋值"是不好的。不相容这个词是不好的。第20行内容如下:
head = head->next;
第68行内容如下:
tail->next = n;
这是因为
struct Node{
...
struct node *next;
};
看? *next
不是struct Node
而是struct node
。大写/小写计数。
还行。这是一个很大的问题。编译器并没有说什么。好吧,公平地说,它确实做到了。但我们不知道这意味着什么。第 33 行:
char a;
你说怎么了?这是一种包含角色的类型,对吧?问题就在这里:
a = fgetc(file1);
你看到了吗?这里怎么样?
while(a != EOF){
EOF是一个哨兵值,太大而无法放入char
。应该是这样的。为了让fgetc
函数告诉您发生了文件结束情况,而不仅仅是文件中的另一个字节,它必须返回字符范围之外的值(0..255 无符号,-128..127 有符号(。while
条件永远不会失败,因为没有char
值可以与 EOF 相提并论。
所以宣布a
是int
,而不是char
。