掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24947

アクセス権をrwxに変換
投稿者---Cunt(2005/12/23 22:03:02)


3桁のアクセス権をrwxに変換して表示させる関数がなかったので、プログラムを作っています。
セグメンテーションエラーで動作してくれません。
このエラーだと、とても原因が探しにくいです、ビット演算はまだ不慣れなため、もしかしたらここが違うのかも。
もし原因がわかりましたらヒントをいただけないでしょうか。
環境は、RH7、GCCです。
ソースは以下のようになります。

#include<string.h>
#include<stdio.h>
char *perm(int c)
  {
  char *tmp;
  int i,keta[3];
  keta[2] = c/100;
  keta[1] = (c%100)/10;
  keta[0] = (c%100)%10;
  for(i=0;i<=2;i++) {
    if(keta[i]&0X04)
      strcat(tmp,"r");
    else
      strcat(tmp,"-");
    if(keta[i]&0X02)
      strcat(tmp,"w");
      else
    strcat(tmp,"-");
    if(keta[i]&0X01)
      strcat(tmp,"x");
    else
      strcat(tmp,"-");
  }
  return(tmp);
}


main()
{
  int modetmp = 753;
  printf("%d = %s\n",modetmp,perm(modetmp));
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:アクセス権をrwxに変換 24948 si 2005/12/23 22:32:22
<子記事> Re:アクセス権をrwxに変換 24949 wiz 2005/12/23 22:43:16


No.24948

Re:アクセス権をrwxに変換
投稿者---si(2005/12/23 22:32:22)


char *perm(int c)
 char *tmp; <- 初期化されていない。

 if(keta[i]&0X04)
  strcat(tmp,"r"); <- 最初はstrcyの方が良いのでは...
 else
  strcat(tmp,"-");

 return(tmp); <- 関数を抜けるとtmpはどうなるの

char *perm(int c,char *mode) として呼び出すようにした方が良いのでは


この投稿にコメントする

削除パスワード

No.24949

Re:アクセス権をrwxに変換
投稿者---wiz(2005/12/23 22:43:16)


>strcat(tmp,"r");
tmpはポインタであって文字配列ではありません。
実態を持たないので連結させるべき領域にアクセスできないと
いわれています。
またローカル変数なため、この関数を抜けると
その変数は消滅します。

/*
 * VC++6.0 WinXP
 */
#include<string.h>
#include<stdio.h>
char *perm(int c)
{
  static char tmp[10] = {'\0'};
  int i,keta[3];
  keta[2] = c/100;
  keta[1] = (c%100)/10;
  keta[0] = (c%100)%10;
  for(i=0;i<=2;i++) {
    if(keta[i]&0X04)
      strcat(tmp,"r");
    else
      strcat(tmp,"-");
    if(keta[i]&0X02)
      strcat(tmp,"w");
      else
    strcat(tmp,"-");
    if(keta[i]&0X01)
      strcat(tmp,"x");
    else
      strcat(tmp,"-");
  }
  return(tmp);
}


main()
{
  int modetmp = 753;
  printf("%d = %s\n",modetmp,perm(modetmp));
}


とりあえず、動くように。。。


この投稿にコメントする

削除パスワード

No.24955

Re:アクセス権をrwxに変換
投稿者---RAPT(2005/12/24 00:50:57)


// 手抜き・・・いい言葉だ。if文なしでの例。
#include <stdio.h>

char *perm(int mode)
{
    static const char *flags = "-xw-r";
    static char buff[10] = {0};
    int i, u;
    for(i = 2; i >= 0; --i){
        u = mode % 10, mode /= 10;
        buff[i*3]   = flags[u & 4];
        buff[i*3+1] = flags[u & 2];
        buff[i*3+2] = flags[u & 1];
    }
    return buff;
}

int main(void)
{
    int mode = 753;
    printf("%d = %s\n", mode, perm(mode));
    return 0;
}
------------------------------------------------------------
[出力結果]
753 = rwxr-x-wx
------------------------------------------------------------
Windows2000sp4/VC++6sp6/Console



この投稿にコメントする

削除パスワード

No.24956

Re:アクセス権をrwxに変換
投稿者---επιστημη(2005/12/24 01:29:28)


> 手抜き・・・いい言葉だ。if文なしでの例。

高々8パターンなんだから全部リテラルで抱え込んでいんでねぇの (^^

const char* pattern[] = { "---", .... };



この投稿にコメントする

削除パスワード

No.24970

Re:アクセス権をrwxに変換
投稿者---かずま(2005/12/24 22:24:39)


// for 文もない、手抜きです。
#include <stdio.h>

char *perm(int mode)
{
    static char buf[10], pattern[] = "-----x-w--wxr--r-xrw-rwx??????";
    #define X(t)  (pattern + mode / t % 10 * 3)
    sprintf(buf, "%.3s%.3s%.3s", X(100), X(10), X(1));
    #undef X
    return buf;
}

int main(void)
{
    int mode = 753;
    printf("%d = %s\n", mode, perm(mode));
    return 0;
}



この投稿にコメントする

削除パスワード

No.24957

Re:アクセス権をrwxに変換
投稿者---Cunt(2005/12/24 01:55:22)


返信ありがとうございます。
static char tmp[10] = {'\0'};
とすることで動きました。
配列とポインタの関係が理解できないでいます。
配列とポインタは同じように扱えると考えていたのですが、この機会にしっかり理解しようと思います。
後、表示の順番が逆になっていたので直しました。
どうもありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧