【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131at TECH
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 - 暇つぶし2ch908:デフォルトの名無しさん
07/09/06 21:58:04
if文を任意の位置でぬけるbreakとかcontinueみたいな
命令ってないですか?

909:デフォルトの名無しさん
07/09/06 22:00:49
>>908
こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:

910:デフォルトの名無しさん
07/09/06 22:01:58
goto

911:デフォルトの名無しさん
07/09/06 22:15:29
>>909-910
サンクス

912:デフォルトの名無しさん
07/09/06 22:38:47
do {
if(...)
{
}
else if(...)
{
....
break;
}
} while(0)
とか

913:デフォルトの名無しさん
07/09/06 23:43:12
俺がよく使うのは

if(...){
 do{

  ...

  if(...) break;

  ...

 }while(0);
}

914:デフォルトの名無しさん
07/09/07 00:12:33
何その隠れgoto

915:デフォルトの名無しさん
07/09/07 00:51:35
んな隠れgoto使うくらいなら、素直にgotoで書いた方が未だ見やすい希ガス。
そもそも、ロジックを整理すべきじゃないかとは思うが。

916:デフォルトの名無しさん
07/09/07 00:54:57
if (...){

 ...

 if(!...){

  ...

 }
}

でいいんじゃないの?


917:デフォルトの名無しさん
07/09/07 01:11:34
int i;

scanf("%d",&i);

while( i<1 || i>9999 )
 {
 printf("もう一度入力してください");
 scanf("%d",&i);
 }


iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力~”がえんえんループ表示されてしまいます。
これを防ぐにはどうしたらいいのでしょうか?

918:デフォルトの名無しさん
07/09/07 01:14:43
>>917
URLリンク(ja.wikipedia.org)

919:917
07/09/07 01:23:41
>>918
ありがとうございます!

920:デフォルトの名無しさん
07/09/07 01:26:09
>>918
その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。

921:デフォルトの名無しさん
07/09/07 01:34:26
それではどうすればいいかってのは、このスレでガイシュツです。

922:デフォルトの名無しさん
07/09/07 10:37:17
typedef struct _st {
  char ** ppsz;
} st;

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(*pst->ppsz != NULL) {
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst->ppsz != NULL) {
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    free(pst);
  }
  return;
}

923:デフォルトの名無しさん
07/09/07 10:38:36

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3);
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
    // make struct member
    pst[i].ppsz = (char**)malloc(2);
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(10);
      }
    }
    // free memory
    freeif(pst);
  }
  return 0;
}


924:デフォルトの名無しさん
07/09/07 10:40:37
メモリの解放が上手くいきません。よろしくお願いします。

(正誤)
if(pst->ppsz != NULL) {  ← ×
if(pst[i].ppsz != NULL) { ← ○

925:デフォルトの名無しさん
07/09/07 11:03:01
>>923
typedef struct _st {
  char ** ppsz;
} st;
static const char STRINGS[3][2][11] = {
  { "idx1:data1", "idx1:data2", },
  { "idx2:data1", "idx2:data2", },
  { "idx3:data1", "idx3:data2", },
};

void freeif(st* pst) {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 2; j++) {
      if(pst[i].ppsz[j] != NULL) {
        printf("pst[%d].ppsz[%d]:FREE\n", i, j);
        free((void*)pst[i].ppsz[j]);
      }
    }
  }
  for(int i = 0; i < 3; i++) {
    if(pst[i].ppsz != NULL) {
      printf("pst[%d].ppsz:FREE\n", i);
      free((void*)pst[i].ppsz);
    }
  }
  if(pst != NULL) {
    printf("pst:FREE\n");
    free(pst);
  }
  return;
}

926:デフォルトの名無しさん
07/09/07 11:03:55

int main(void) {
  st* pst;
  // make struct object
  pst = (st*)malloc(3 * sizeof(st));
  if(pst == NULL) {
    printf("st is null\n");
  }
  else {
    for(int i = 0; i < 3; i++) {
      // make struct member
      pst[i].ppsz = (char**)malloc(2 * sizeof(char*));
      for(int j = 0; j < 2; j++) {
        // make member area
        pst[i].ppsz[j] = (char*)malloc(11 * sizeof(char));
        lstrcpy(pst[i].ppsz[j], STRINGS[i][j]);
      }
    }
    // debug
    printf("---------------------\n");
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 2; j++) {
        printf("pst[%d].ppsz[%d] >> %s\n", i, j, pst[i].ppsz[j]);
      }
    }
    printf("---------------------\n");
    // free memory
    freeif(pst);
  }
  _getch();
  return 0;
}

927:デフォルトの名無しさん
07/09/07 11:31:28
>>922-924
固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。


928:デフォルトの名無しさん
07/09/07 11:36:05
メモリ動的確保/解放の練習とかじゃない?>>927

929:デフォルトの名無しさん
07/09/11 22:08:23
C89 の規格票ってどこかで見れない?

930:デフォルトの名無しさん
07/09/11 22:38:18
過去ログにURLが転がってたような。
印刷できないPDFでよければJISCのサイトで閲覧できる

931:デフォルトの名無しさん
07/09/11 23:14:17
JISCって過去の規格票まで見れたっけ?
現在有効のX3010:2003はC99相当だけど。

932:デフォルトの名無しさん
07/09/11 23:19:57
最新版以外はなかったことになるから。
ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。
JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか

933:デフォルトの名無しさん
07/09/12 00:31:37
そうなんだよな。それにJIS漢字も追加で。

934:デフォルトの名無しさん
07/09/12 00:53:09
おいおい、JIS漢字を忘れちゃいないか?

935:デフォルトの名無しさん
07/09/12 01:01:56
規格票

936:デフォルトの名無しさん
07/09/12 01:15:46
無粋なヤツだな

937:デフォルトの名無しさん
07/09/12 02:38:12
無粋

938:デフォルトの名無しさん
07/09/12 03:48:23
今日学校でプロトタイプ宣言に関する問題を習ったんですが
問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい
プロトタイプ宣言:int Power(int x,int n);

実行画面
文字列入力==>2
文字列入力==>0
値:1

文字列入力==>2
文字列入力==>3
値:8

文字列入力==>6
文字列入力==>4
値:1296

この問題だけどうしても判らなくて困っています^^;
何方かわかる方がいましたら教えてください



939:デフォルトの名無しさん
07/09/12 04:00:01
>>938
int Power(int x,int n)
{
int i;
int sum = 1;
if(n == 0)
return 1;
else{
for(i = n; i > 0; i--)
sum *= x;
}
return sum;
}

940:デフォルトの名無しさん
07/09/12 04:04:51
再帰じゃないじゃん

941:939
07/09/12 04:06:40
あ、再帰だったんだ、出直してくる。

942:939
07/09/12 04:16:22
再帰版
int Power(int x,int n)
{
if(n == 0)
return 1;
else
return x*Power(x,n-1);
}

943:デフォルトの名無しさん
07/09/12 04:21:11
int Power(int x, int n)
{
if(x == 0 && n == 0) exit(1);
if(n < 0) return 0;
if(n == 0) return 1;
return Power(x, n - 1) * x;
}

944:デフォルトの名無しさん
07/09/12 06:51:52
static int power(int x, int n, int v)
{
if (n < 0) return 0;
if (n == 0) return v;
return power(x, n - 1, x * v);
}
int Power(int x, int n) {return power(x, n, 1);}
これで末尾再帰で最適化が利いてループになるはず。

945:デフォルトの名無しさん
07/09/13 09:13:16
特定の範囲の整数(例えば1~10000)だけを入力させたいのですが、
fgets()使用時に桁溢れを完全に抑止することは可能ですか?

char *buf[10];
unsigned int value;
while(1)
{
fgets(buf, 10, stdin);

~isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak~

}
fprintf(stdout, "%u\n", value);

こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。
何かイイ方法あるでしょうか?(fflush(stdin)は無しで)

946:945
07/09/13 09:14:22
>>945
× char *buf[10]
○ char buf[10]
orz

947:デフォルトの名無しさん
07/09/13 09:19:36
>>945
fgets の後で
fscanf(stdin,"%*[0-9]");

948:デフォルトの名無しさん
07/09/13 11:18:05
>>947
通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?

949:デフォルトの名無しさん
07/09/13 11:22:42
fflush(stdin)と置換可能な関数を自作するのは厳しい
とはいえ、fflush(stdin)は未定義
面倒くさいけど、fgetsで読み込んだbufに'\n'が有るかチェックして、
'\n'が無いなら'\n'が出てくるまで読み捨てることになる

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

int main(void)
{
  char buf[10];
  char *p;
  int c;
  while (fgets(buf, sizeof buf, stdin) != NULL) {
    if ((p = strchr(buf, '\n')) != NULL) {
      *p = '\0';
    }
    else {
      while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
    }
    puts(buf);
  }
  return 0;
}


950:デフォルトの名無しさん
07/09/13 12:33:40
もっといい方法あるのかもしれないけど、こんなんでどうかな

int get_unsigned(unsigned *v)
{
  char buf[16];
  char *p;
  int c;

  if (fgets(buf, sizeof buf, stdin) == NULL)
    return EOF;
  if (strchr(buf, '\n') == NULL)
    while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
  *v = strtoul(buf, &p, 10);
  return *p;
}

int main(void)
{
  unsigned val;
  int end;

  while (printf(">>"), (end = get_unsigned(&val)) != EOF) {
    if (end == '\0' || isdigit(end)) printf("W:入力が切り捨てられました.\n");
    else if (end != '\n')      printf("W:不正文字がありました. '%c'\n", end);
    if (val < 1 || 10000 < val)   printf("W:入力範囲外です.\n");
    printf("<<%u\n", val);
  }
  return 0;
}

951:945
07/09/13 13:55:57
>>947-950
ありがとうございます。おかげさまで解決しました。

952:デフォルトの名無しさん
07/09/13 14:16:48
scanf("%*[^\n]%*c");なんてできなかったっけ?

953:デフォルトの名無しさん
07/09/13 14:20:57
>>952
それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk

954:デフォルトの名無しさん
07/09/15 02:24:20
うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。
俺には凄過ぎっすよ。

955:デフォルトの名無しさん
07/09/15 02:26:09
名プログラマになる為に猛勉強だぜ。

956:デフォルトの名無しさん
07/09/15 09:32:53
ここは知ったかばっかり

957:デフォルトの名無しさん
07/09/17 15:28:45
知ったかな~知ったかな~うにゃうにゃ
はれってほれってひれんら~

958:デフォルトの名無しさん
07/09/17 18:37:19
>>957 迂闊にも笑ってしまいますた

959:デフォルトの名無しさん
07/09/18 17:05:01
SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが
sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?

960:デフォルトの名無しさん
07/09/18 17:07:56
はい。

961:デフォルトの名無しさん
07/09/18 18:26:29
ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか?
素直に本買ったほうがいいでしょうか?

962:デフォルトの名無しさん
07/09/18 18:35:59
っ[JIS X 3010]

963:961
07/09/18 19:21:05
>>962
ありがとう。でも高いねコレ…素直に本買います。

964:デフォルトの名無しさん
07/09/18 20:47:24
つ[URLリンク(www.jisc.go.jp])

965:デフォルトの名無しさん
07/09/19 15:50:54
設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって
どうやるか教えていただけませんか?

966:デフォルトの名無しさん
07/09/19 16:06:49
たぶんCの話じゃないと思うぞ

967:デフォルトの名無しさん
07/09/19 17:28:22
今C言語の勉強をしていて、ファイルの情報を構造体に格納して
それをメモリに展開するってゆーのをやってまして

968:デフォルトの名無しさん
07/09/19 17:30:39
fread

969:デフォルトの名無しさん
07/09/19 17:32:23
そんなもんファイルにどういう形式でデータが記録されていて
格納する構造体はどんなものかによるとしか言えん

970:デフォルトの名無しさん
07/09/19 17:34:00
PADは関係あるのか?

971:デフォルトの名無しさん
07/09/19 17:34:18
JIS X 3010-1993 を読むと

3.4
バイト
実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。
1 バイト中のビット数は,処理系定義とする。
5.2.4.2.1
CHAR_BIT
ビットフィールドでない最小オブジェクト(バイト)におけるビット数
6.3.3.4
sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。
sizeof(char) == 1

となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは
1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?


972:デフォルトの名無しさん
07/09/19 17:36:24
マジっすか。バイト=8bitだと信じてました。
int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・

973:967
07/09/19 17:58:00
今PADの最中なんです。
問題としてはファイルにある社員IDと氏名を構造体に格納し、
メモリに展開するというものです

974:デフォルトの名無しさん
07/09/19 18:06:04
C言語の規格改定って今でも進められているんでしょうか?

975:デフォルトの名無しさん
07/09/19 18:47:35
>>971
そう思って構わないはず。

>>973
常に8ビットを表す単位が必要なら、オクテットを使う。

976:967
07/09/19 19:03:57
文字の長さが2-10で変化するってどゆ意味ですか?
そもそも文字の長さってなんですか?

977:デフォルトの名無しさん
07/09/19 19:09:43
次スレテンプレ

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132



このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
URLリンク(www.kouno.jp)
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
URLリンク(www.amazon.co.jp)

他の過去ログはここに
URLリンク(nssearch.hp.infoseek.co.jp)
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
スレリンク(tech板)


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
スレリンク(tech板)
C/C++の宿題を片付けます 95代目
スレリンク(tech板)

978:デフォルトの名無しさん
07/09/19 19:15:34
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
                                 ↓
GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は

何か気になるから変えてくれたら嬉しい

979:デフォルトの名無しさん
07/09/19 19:58:51
>>937
お前前も来たな
帰れ
いや
死ね

980:デフォルトの名無しさん
07/09/19 19:59:21
>>973だった

981:デフォルトの名無しさん
07/09/19 20:22:18
(char *)*char_list->c
という式が表す値は
(char *)型のポインタcが指しているデータ
(char *)型のデータ
のどっちなんでしょうか?

982:デフォルトの名無しさん
07/09/19 20:37:54
演算子の優先順位から、(char *)(*(char_list->c))

983:デフォルトの名無しさん
07/09/19 20:47:49
>>982
その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?

984:デフォルトの名無しさん
07/09/19 20:52:45
そりゃ意味からして別物だろうが

985:デフォルトの名無しさん
07/09/19 20:56:27
ついでに言うと、関数呼出演算子の括弧も別物。

986:デフォルトの名無しさん
07/09/19 21:04:19
>>985
全部一緒くたにして考えてました。orz
最後にもう一つ、

char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);

予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?

987:デフォルトの名無しさん
07/09/19 21:06:35
何を言ってるんだ、お前は

988:デフォルトの名無しさん
07/09/19 21:07:45
*(int*)pc とでもやりたかったのか?

989:デフォルトの名無しさん
07/09/19 21:09:33
>>986
何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。

990:デフォルトの名無しさん
07/09/19 21:11:57
>>986
charだろうがintだろうが10進数で出力したら97だろ

991:デフォルトの名無しさん
07/09/19 21:13:08
>>986
>4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ

992:デフォルトの名無しさん
07/09/19 21:15:21
char c = 'a';
char *pc = &c;
printf("%d\n", sizeof((int)*pc));

4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ

993:デフォルトの名無しさん
07/09/19 21:16:26
>>986
これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。

994:デフォルトの名無しさん
07/09/19 22:21:24
>>973
PADって構造化フローチャートみたいなやつ?


995:デフォルトの名無しさん
07/09/19 22:24:57
>>994
大学でやった記憶が

996:デフォルトの名無しさん
07/09/20 02:05:03
99というのはISOの年度だからANSI C99というのはおかしくないか

997:デフォルトの名無しさん
07/09/20 02:12:12
おかしいね。
ANSI C89
ISO C90
ISO C95(と言っていいのか)
ISO C99

998:デフォルトの名無しさん
07/09/20 08:33:04
個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。
まぁキモいだけで、だからどうしようってほどじゃないけど。

999:デフォルトの名無しさん
07/09/20 09:18:44
埋め

1000:デフォルトの名無しさん
07/09/20 09:20:04


1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch