📜  unox 回收口琴标签 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:20:54.399000             🧑  作者: Mango

Unox回收口琴标签 - C 编程语言

简介

这是一个使用C编程语言编写的程序,用于回收Unox口琴标签。Unox公司希望不再浪费大量的标签,因此开始回收使用过的标签。此程序可以处理收集到的标签并将其回收。

功能

程序实现了以下功能:

  1. 循环接收用户输入的标签编号,直到用户输入“quit”为止。
  2. 判断标签编号是否合法,如果不合法则显示错误提示。
  3. 将合法的标签编号添加到一个动态数组中。
  4. 在用户输入“quit”后,显示输入的总标签数量并将标签写入一个文件中。
  5. 读取标签文件并将标签显示在控制台中。
  6. 将读取到的标签按顺序存储到一个链表中。
程序实现

此程序使用了下列C函数:

  1. printf(): 显示消息和标签编号。
  2. scanf(): 接收用户输入的标签编号和命令。
  3. atoi(): 将字符串转换为数字。
  4. isalnum(): 判断字符是否为字母或数字。
  5. realloc(): 调整动态数组的大小。
  6. memset(): 初始化内存数据。
  7. fopen(): 打开文件。
  8. fprintf(): 将标签写入文件。
  9. fclose(): 关闭文件。
  10. fgets(): 从文件中读取标签数据。
  11. malloc(): 为链表节点分配内存。
  12. strcpy(): 将字符串复制到链表节点中。
  13. free(): 释放链表节点内存。
代码片段

下面是此程序的代码片段:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int is_valid(char* tag) {
    // 判断标签是否合法
}

int main() {
    char input[20], *tag;
    int total_tags = 0, i = 0, *tags = NULL;
    FILE* fp;
    struct node {
        char tag[10];
        struct node* next;
    } *head = NULL, *p = NULL;

    while (1) {
        printf("Enter a tag number or 'quit': ");
        scanf("%s", input);
        if (strcmp(input, "quit") == 0) {
            break;
        }
        if (!is_valid(input)) {
            printf("Invalid tag number.\n");
            continue;
        }
        tag = strdup(input);
        tags = (int*)realloc(tags, sizeof(int) * (i + 1));
        tags[i++] = atoi(tag);
        total_tags++;
        free(tag);
    }

    printf("You entered %d tags.\n", total_tags);
    fp = fopen("tags.txt", "w");
    for (i = 0; i < total_tags; i++) {
        fprintf(fp, "%d\n", tags[i]);
    }
    fclose(fp);

    fp = fopen("tags.txt", "r");
    p = head = (struct node*)malloc(sizeof(struct node));
    memset(head, 0, sizeof(struct node));
    while (fgets(input, 20, fp) != NULL) {
        if (input[strlen(input) - 1] == '\n') {
            input[strlen(input) - 1] = '\0';
        }
        strcpy(p->tag, input);
        p->next = (struct node*)malloc(sizeof(struct node));
        memset(p->next, 0, sizeof(struct node));
        p = p->next;
    }
    fclose(fp);

    printf("Tags read from file:\n");
    p = head;
    while (p->next != NULL) {
        printf("%s\n", p->tag);
        p = p->next;
    }
    p = head;
    while (p->next != NULL) {
        struct node* temp = p->next;
        free(p);
        p = temp;
    }
    free(p);

    free(tags);

    return 0;
}

此代码实现了标签的读写和处理功能,同时还包括了链表的创建和使用。