【问题标题】:C list sorting program works only after debuggingC列表排序程序只有在调试后才能工作
【发布时间】:2014-02-18 04:00:48
【问题描述】:

我写了一个小程序,它从 txt 文件中读取单词并将它们放在一个列表中;然后,它对单词进行排序并将它们放回文件中。当我运行程序时,它会冻结,但是当我调试它时,它运行良好。我该如何解决这个问题?

这是我的代码。从文件读取到列表并写回文件效果很好(检查其他程序)。我不知道如何按字母顺序对列表进行排序,所以我使用数组:

typedef struct bazaslowek                                    
{
    char *word;
    struct bazaslowek* next;
} baza;

void SORTING (baza **head)
{//================================file->list, works good
    char word[30];
    FILE *fp;
    if ((fp = fopen("bazaslow.txt", "r"))==NULL)
    {
        printf("Error while opening txt file!");
        exit(EXIT_FAILURE);
    }
    else
    {
        while(!feof(fp))
        {
            fscanf(fp,"%s\n", word);
            baza *wsk = *head;
            baza *new = malloc (sizeof(baza));
            new -> next = NULL;
            new -> word = strdup(word);
            if(wsk == NULL)
            {
                new -> next = *head;
                *head = new;
            }
            else
            {
                while(wsk -> next != NULL)
                    wsk = wsk -> next;
                wsk -> next = new;
            }
        }
    }
    fclose(fp);
    //==========================================Here's the sorting, problem is probably here

    baza *wsk= (*head);
    char tab1[31], tab2[31];
    if(wsk ->next != NULL)
        while(wsk->next != NULL)
        {
            memcpy(tab1, wsk->word, 30);
            memcpy(tab2, wsk->next->word, 30);
            if (strcmp(tab1, tab2) > 0)
            {
                memcpy(wsk->word, tab2, 30);
                memcpy(wsk->next->word, tab1, 30);
            }
            wsk = wsk->next;
        }

    //======================list->file, works good
    if ((fp = fopen("bazaslow.txt", "w"))==NULL)
    {
        printf("Error while opening file!");
        exit(EXIT_FAILURE);
    }
    else
    {
        baza *wsk = *head;
        while (wsk != NULL)
        {
            fprintf(fp, "%s\n", wsk->word);
            wsk=wsk->next;
        }
    }
    fclose(fp);
}

int main()
{
    baza *head=NULL;
    printf("Sorting time!\n");
    SORTING(&head);
    return 0;
}

我真的不知道为什么它有时有效,有时却无效。我在上面坐了很长时间,但不能更改代码,所以它会一直工作。有人可以帮我吗?怎么了?代码应该如何显示才能使程序始终运行?

【问题讨论】:

  • 在调试器中运行调试构建not会发生什么?如果你调试发布版本会发生什么(这更难做,因为调试器不会知道所有值)?
  • 我推荐适当的缩进,它确实有助于更好地理解代码
  • noelicus,我该怎么做?我不是来自英语国家,理解你的意思有点问题。如果你能告诉我怎么做,我将不胜感激。
  • memcpy(wsk->word, tab2, 30); wsk->word 不一定是30的大小,只要简单地替换指针即可。
  • 我发布答案(示例)。还有while(!feof(fp))有潜在问题,改成while(EOF!=fscanf(fp,"%s\n", word))

标签: c list debugging sorting structure


【解决方案1】:

例如排序样本

baza *outerp, *innerp;
for(outerp=*head;outerp->next != NULL;outerp=outerp->next){
    for(innerp = outerp->next;innerp != NULL;innerp=innerp->next){
        if(strcmp(outerp->word, innerp->word) > 0){
            char *tmp = outerp->word;
            outerp->word = innerp->word;
            innerp->word = tmp;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多