C言語関係掲示板

過去ログ

No.210.エラーチェックの追加


No.1304

エラーチェックを入れたいのですが
投稿者---zeros(2002/03/22 13:46:32)


No.1280のプログラムにエラーチェック機能を入れたいのですがどうすればいいのでしょうか教えてください。チェック1としてアルファベット以外の文字列がないかどうか、チェック2として文字数14字を越えていないかというこの2点について、また、エラーの場合はデータを無効とし入力を催促し直す。

No.1305

Re:エラーチェックを入れたいのですが
投稿者---かずま(2002/03/22 21:14:13)


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

int compare(const void *a, const void *b)
{
  return strcmp(*(char **)a, *(char **)b);
}

int valid(const char *name)
{
  int i, len = strlen(name);

  if (len == 0)
    return puts("No name! Try again."), 0;
  if (len > 14)
    return puts("More than 14 characters! Try again."), 0;
  for (i = 0; i < len; i++)
    if (!isalpha((unsigned char)name[i]))
      return puts("Not an alphabet found! Try again."), 0;
  return 1;
}

int main()
{
  char name[256], *table[20], *p;
  int i, n = 0;

  while (n < 20) {
    if (fgets(name, sizeof name, stdin) == NULL || name[0] == '!')
      break;
    if (p = strchr(name, '\n'))
      *p = '\0';
    if (!valid(name))
      continue;
    table[n++] = strdup(name);
  }
  qsort(table, n, sizeof(char *), compare);
  for (i = 0; i < n; i++)
    puts(table[i]);
  return 0;
}


No.1334

Re:さらに追加したいのですが
投稿者---zeros(2002/03/26 17:17:30)


>#include <stdio.h>
>#include <string.h>
>#include <stdlib.h>
>#include <ctype.h>
>
>int compare(const void *a, const void *b)
>{
>  return strcmp(*(char **)a, *(char **)b);
>}
>
>int valid(const char *name)
>{
>  int i, len = strlen(name);
>
>  if (len == 0)
>    return puts("No name! Try again."), 0;
>  if (len > 14)
>    return puts("More than 14 characters! Try again."), 0;
>  for (i = 0; i < len; i++)
>    if (!isalpha((unsigned char)name[i]))
>      return puts("Not an alphabet found! Try again."), 0;
>  return 1;
>}
>
>int main()
>{
>  char name[256], *table[20], *p;
>  int i, n = 0;
>
>  while (n < 20) {
>    if (fgets(name, sizeof name, stdin) == NULL || name[0] == '!')
>      break;
>    if (p = strchr(name, '\n'))
>      *p = '\0';
>    if (!valid(name))
>      continue;
>    table[n++] = strdup(name);
>  }
>  qsort(table, n, sizeof(char *), compare);
>  for (i = 0; i < n; i++)
>    puts(table[i]);
>  return 0;
>}

大変ありがとうございました。すみませんがこのプログラムのソートの処理を
リスト構造を用いた処理に変更するとどうなりますか教えて下さい。


No.1337

Re:さらに追加したいのですが
投稿者---かずま(2002/03/27 03:15:50)


typedef struct Node Node;
struct Node {
  char *name;
  Node *next;
};

int main()
{
  char name[256], *p;
  int n = 0;
  Node list = { NULL, NULL }, *np, *lp;

  while (n < 20) {
    if (fgets(name, sizeof name, stdin) == NULL || name[0] == '!')
      break;
    if (p = strchr(name, '\n'))
      *p = '\0';
    /* if (!valid(name)) continue; */
    lp = &list;
    while (lp->next && strcmp(lp->next->name, name) < 0)
      lp = lp->next;
    np = malloc(sizeof(Node));
    np->name = strdup(name);
    np->next = lp->next;
    lp->next = np;
    n++;
  }
  for (np = list.next; np; np = np->next)
    puts(np->name);
  return 0;
}

メモリーが足りなくなると、malloc や strdup は NULL を返すので、
本当はそのチェックが必要です。list が不要になった後もプログラムが
終了せず、さらにメモリー確保があるのなら、list は free しましょう。



No.1344

Re:さらに追加したいのですが
投稿者---zeros(2002/03/27 17:05:34)


度々教えて頂きありがとうございます。
教えてもらったプログラム実行しようと思ったのですが、 

error C2440: '=' : 'void *' から 'struct Node *' に
変換することはできません

というエラーが出たのですがどこを変更すればよいのでしょうか。

No.1348

Re:さらに追加したいのですが
投稿者---かずま(2002/03/27 20:39:10)


> error C2440: '=' : 'void *' から 'struct Node *' に
> 変換することはできません

zeros さんは、C++コンパイラを使っていますね。
ファイル名の拡張子を .c にすると、Cプログラムとして、
コンパイルしてくれるでしょう。

あるいは、エラーの出た行を

    np = new Node;

として、C++プログラムにしてしまう手もあります。

No.1362

Re:さらに追加したいのですが
投稿者---zeros(2002/03/31 16:32:58)


言われたところを代えたらちゃんと動きました。
いろいろありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved