[ create a new paste ] login | about

Link: http://codepad.org/BIXez9xC    [ raw code | output | fork ]

C, pasted on Jul 25:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define xmalloc malloc
#define xfree free

#define NAME_LENGTH 20 /* 名前を格納する文字列の長さ */
#define ADDRESS_LENGTH 30 /* 住所を格納する文字列の長さ */

typedef struct p_tag{
  char name[NAME_LENGTH];
  char address[ADDRESS_LENGTH];
  int age;
  struct p_tag *next;
} personal_t;

personal_t *makeNewNode(char *name, char *address, int age) {
  personal_t *pNewNode;
  if ((pNewNode = xmalloc(sizeof(personal_t))) != NULL) {
    strncpy(pNewNode->name, name, NAME_LENGTH - 1);
    (pNewNode->name)[NAME_LENGTH - 1] = '\0';
    strncpy(pNewNode->address, address, ADDRESS_LENGTH - 1);
    (pNewNode->address)[ADDRESS_LENGTH - 1] = '\0';
    pNewNode->age = age;
    pNewNode->next = NULL;
  }
  return pNewNode;
}

void add(personal_t **top, char *name, char *address, int age) {
  personal_t *p;
  if (*top == NULL || (*top)->age > age) {
    if ((p = makeNewNode(name, address, age)) != NULL) {
      p->next = *top;
      *top = p;
    }
  } else {
    add(&((*top)->next), name, address, age);
  }
}

int get(personal_t **top, char *name, char *address, int *age) {
  personal_t *p;
  if (*top != NULL) {
    p = *top;
    *top = (*top)->next;
    strncpy(name, p->name, NAME_LENGTH - 1);
    name[NAME_LENGTH - 1] = '\0';
    strncpy(address, p->address, ADDRESS_LENGTH - 1);
    address[ADDRESS_LENGTH - 1] = '\0';
    *age = p->age;
    xfree(p);
    return 0;
  }
  return 1;
}

#define BUFFLEN 1024
int main(int argc, char *argv[]) {
  personal_t *pTop = NULL;
  FILE *fp;
  char name[NAME_LENGTH];
  char address[ADDRESS_LENGTH];
  char buff[BUFFLEN];
  int age;
  if (argc != 2) {
    printf("Usage: %s datafilename.\n", argv[0]);
    return EINVAL;
  }
  if ((fp = fopen(argv[1], "r")) == NULL) {
    printf("No such file %s.\n", argv[1]);
    return ENOENT;
  }
  while (fgets(buff, BUFFLEN, fp) != NULL) {
    if (sscanf(buff, "%s %s %d", name, address, &age) == 3) { /* dangerous !! */
      add(&pTop, name, address, age);
    }
  }
  fclose(fp);
  while (get(&pTop, name, address, &age) == 0) {
    printf("%s %s %d\n", name, address, age);
  }
  return 0;
}
/* end */


Output:
1
2
3
Usage: /t datafilename.

Exited: ExitFailure 22


Create a new paste based on this one


Comments: