1

我试图实现的代码是一种读取 .txt 文件并将字符串转换为节点的方法。本质上,当我阅读 .txt 文件时,我首先检查非字母(该词不能以数字开头,该词也不能在该词的任何索引中具有非字母数字)。一旦找到第一个字母,程序就会退出循环并进入另一个循环,直到它看到一个空格。当我成功地造一个词(当找到一个空格时,一个词“结束”),我将这个词输入到一个链表中。

当我运行它时,我得到一个总线错误:10。我认为这是由于 word[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("%s\n", 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] = '\0';
       }
       n->next = 0;
       if(head == 0){
           head = n;
           tail = n;
       }
       else{
           tail->next = n;
           tail = n;
       }
   }
    testprint(head);
    fclose(file1);
}
4

1 回答 1

3

您应该注意来自编译器的警告。(并且总是编译-Wall -Wextra以获得更多警告是一个好主意。)

正如 Barney Hsiao 所指出的,testprint()用 FILE 指针而不是 Node 指针调用。


相关,但如果您需要真假常量,有一个标准头文件可以为您提供这些(小写,即, )。truefalse

#include <stdbool.h>

编译此代码时,我收到以下编译器警告:

$ CFLAGS="-Wall -Wextra" 制作 bus10
cc -Wall -Wextra bus10.c -o bus10
bus10.c:在函数“testprint”中:
bus10.c:20:14:警告:来自不兼容指针类型的赋值
bus10.c:在函数“主”中:
bus10.c:48:8:警告:数组下标的类型为 'char'
bus10.c:54:8:警告:数组下标的类型为 'char'
bus10.c:68:23:警告:来自不兼容指针类型的赋值
bus10.c:34:8:警告:未使用的变量“x”
bus10.c:31:17:警告:未使用的变量“下一个”
bus10.c:27:17:警告:未使用的变量 'curr'
bus10.c:74:1:警告:控制到达非无效函数的结尾

现在其中一些比其他更严重。“数组下标的类型为'char'”对我来说听起来不是问题(老实说,我什至不知道它是什么意思)。“未使用的变量”意味着:您已经创建(声明)了一个变量,然后您从不使用它。“控制到达非 void 函数的末尾”意味着您有一个声明为返回值的函数,但代码在没有返回语句的情况下掉到了底部。

但是“从不兼容的指针类型赋值”是不好的。不相容这个词是坏的。第 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 进行比较。

所以声明aint,不是char

于 2013-02-15T04:33:44.627 回答