• ベストアンサー

変数の使用方法

ファイルを読み込み、 任意の文字列だけを変数にするプログラムを記述したのですが、 sscanfでその文字列を各変数に代入し、 if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ の行で展開させようとしたのですが、 確認したところ、取得した値が代入していませんでした。 printf("%s\n", cause);の場合は、実行後、画面に表示するのですが、 変数型に問題があるのでしょうか。 すみませんが、何が問題なのかご教授よろしくお願いいたします。 FILE *fp; FILE *fd; char string[MAX_LEN]; char cause[256],point[256],user[256],passwd[256]; char id[256]; while ((fgets(string, MAX_LEN, fp)) != NULL) {  string[strlen(string) - 1] = '\0'; if(sscanf(string, "connect cause = %s", &cause) == 1){  }else if(sscanf(string, "connect point = %s", &point) == 1){  }else if(sscanf(string, "username = %s", &user) == 1){    if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){    }    pclose(fd);   } } fclose(fp);

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

まだこちらが理解できないので、推測で書きますが、 勘違いがあったらお許しください。 popen("smbmount cause /mnt/date -o username=user","r") で、文字列の中の「cause」と「user」が 自動的に展開されると思っていませんか? 展開するにはstrcatかsprintfを使います。 /*文字列に展開するためのバッファ*/ static char buf[256]; .... /* causeとuserを文字列に展開 */ sprintf(buf, "smbmount %s /mnt/date -o username=%s", cause, user); /*bufに文字列が入っているので、それを使ってpopenを呼び出す*/ if((fd = popen(buf, "r")) != NULL){ ... } のようにします。 なお、最初のbufにstaticを付けたのは、 それを付けないと「バッファオーバーフロー」という 現象が心配だったからです。 付けなくても動作するなら無用ですが…。 (string以下の変数も、これでいいのか心配です。 ですがそれで動いているのなら何も言いません)

996
質問者

お礼

ありがとうございます。 まだまだ未熟なため、分からない部分が多々あったと思います。 現在では、やはりsmbmountとパスワード入力部分が問題なので、別の方法で模索中です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

char cmd[1024]; sprintf(cmd, "smbmount %s /mnt/%s -o username=%s", cause, point, user); if ((fd = popen(cmd, "r")) ... をしたいのでしょうか? # fd という変数名では、普通のCプログラマなら整数を意図しますが、それはおいといて あと、まだ問題山積です。 なぜ popen() なのか なぜ "r" なのか パスワードは標準入力から入れられるのか? system() と smbmount の password= オプションを使うことは考えましたか?もっとも、これでは、実行中にpsするとパスワードが見えてしまうという欠点があるわけですが。

996
質問者

補足

system()でsmbmountのusernameとpassword、オプションを使用することは当初考えましたが、linuxのコマンドから試みてみましたが、再度パスワードがきかれます。 使用方法が間違っているのかと思いましたが、ヘルプを確認しましたが、同様の結果になりました。 現在は、別の方法で模索中です。

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

失礼ですが、このコードでは、 何がやりたいのか私にはわかりません。 >if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ >の行で展開させようとしたのですが、 といっても、ここには「展開」という動作をする命令が 見あたらないと思いますが…。 常に 「smbmount cause /mnt/date -o username=user」と「r」 という文字列を引数にpopen(パイプオープンでしょうか)を起動するだけで、 それ以外のことをしているようには見えません。 あと、if~else if~の並びも、わかりません。 「sscanf(string, "username = %s", &user) == 1」が 成り立ったときだけ、 「fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL」 を実行したいのでしょうか? また、これを囲んでいるifは意味がないように思います。 よろしければ説明をおねがいします。

996
質問者

補足

linuxのファイルサーバのsambaにあります、smbmountのコマンドを使用しクライアントの共有ファイルをマウントし、/mnt/dateに共有データを閲覧するようにするプログラムを記述しています。 linuxでのコマンドからの使用方法は、 #smbmount //マシンの名前/共有フォルダ /mnt/project -o usernamed=administrator #>パスワード入力になります。 マウントがしっかりと動作した場合、クライアントマシンの共有フォルダの内容が/mnt/projectフォルダにて閲覧できるようになります。 また、マウントを解除する場合は、 #umount /mnt/projectになります。 プログラムの記述は、 FILE *fp; FILE *fd; char string[MAX_LEN]; char cause[256],point[256],user[256],passwd[256]; fp = fopen("file.conf", "r"); while ((fgets(string, MAX_LEN, fp)) != NULL) {  if(sscanf(string, "connect cause = %s", &cause) == 1){  }else if(sscanf(string, "connect point = %s", &point) == 1){  }else if(sscanf(string, "username = %s", &user) == 1){  }else if(sscanf(string, "password = %s", &passwd) == 1){   if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){    fputs("passwd\n",fd);    system("umount /mnt/date");   }   pclose(fd);  } } fclose(fp); です。 file.confの中は、 connect cause = //caprice/docomo →cause connect point = //homw/www →point username = administrator →user password = yumijunsanasyuto →passwd です。 現状では、 if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ の"cause"、"user"に文字列を入れて、smbmountのコマンドを実行させ、fputsでパスワードを入力させるプログラムを記述しようとしていますが、文字列とパスワード入力が動作していない状況です。 説明不足で申し訳ありません。 現在も、色々と試しているのですが、あまり芳しくありません。すみませんが未熟者にご教授よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fgetsとsscanfの使い方

    初歩的な質問で申し訳ないのですが、fgetsとsscanfの使い方が合っているか確認願います fgets(char *s , int n ,FILE *fp); -> fpから1行(nで指定した文字数)読み込み、sに格納する sscanf(char buf, "%s", char string); -> bufから%sを読み込み、stringに格納する まだ使い慣れていないのでどっちから読み込むのかこんがらがってます 上記の解釈でよろしいのでしょうか?

  • _popen() のエラー取得

    WindowsNT/2000で_popen()を利用してコマンドを実行しているのですが、その際のメッセージを取得したいのですが、通常のメッセージは取得出来るのですが、エラーメッセージが取得出来ません。どうすればよいのでしょうか? 現在のソースは下記のようです。 int main(int argc, char* argv[]) { char str[512],*ptr; FILE *fp; if((fp = _popen("dir b:","rt")) == NULL) { fprintf( stderr , "error!!!\n"); return -1; } while(1) { fgets(str,512,fp); if(feof(fp)) { break; } ptr = strchr(str,'\n'); if(ptr != NULL) { *ptr='\0'; } printf("%s\n",str); } _pclose(fp); return 0; }

  • セグメンテーションエラーの原因がわからず困っています

    以下のプログラムで”セグメンテーションエラーです”の文字が表示され上手いこと動きません。 何がダメなのか、ご助言を頂けないでしょうか。どうぞよろしくお願いします。環境はCentosです。 #include<stdlib.h> #include<string.h> main(){ char s[11]; FILE *fp; fp = popen("netstat -s |grep total","r"); if(fp = NULL){ printf("reading error"); exit(-2); } FILE *fp2; fp2 = fopen("file.txt","r"); fscanf(fp,"%9s",s); int a; printf("%s\n",s); a = atol(s); printf("%ld",a); pclose(fp); fclose(fp2); }

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

  • c言語 sscanf の書式についての質問です

    C言語でCSVファイルの読み込みをしようとしています。CSVの中身は以下の2通りあります。 ・[ ] で囲った文字列(1行に1つだけ) ・データの並び(1行に2つ以上) 具体的には、[ ] で囲った文字列と、最初の2つのデータのみが抽出対象です。そこで以下のコードを書いてみましたが、最後に示すように、[ ] で囲った文字列がうまく抽出できません。以下のコードのようなsscanfの使い方は間違っているのでしょうか?正しく動作するにはどうすればよいか、教えて下さい。 ---------- 以下、ソースコード #include <stdio.h> #include <string.h> int main(void) {  FILE *fp;  char *fname = "test.csv";  char s1[32], s2[16];  int ret;  char str[128];    /* csvファイルの一行 */  char structName[32];  /* セパレータ名 */  fp = fopen( fname, "r" );  if( fp == NULL ){   printf( "%sファイルが開けません\n", fname );   return -1;  }  while( fgets( str, 128, fp ) != NULL ){      /* セパレータ */   if( str[0] == '[' ){    printf( "str = %s\n", str );    ret = sscanf( str, "[%s]\n", structName );    printf( "structName = %s\n", structName );    continue;   }      ret = sscanf( str, "%[^,],%[^,]", s1, s2 );      printf( "s1 = %s\n", s1 );   printf( "s2 = %s\n", s2 );  }  fclose( fp );  return ret; } ---------- 以下、"test.csv"の中身 [ABC] test01,10,11,1.0,1.1 test02,20,21,2.0,2.1 test03,30,31,3.0,3.1 [DEF] test04,40,41,4.0,4.1 ---------- 以下、実行結果 str = [ABC] structName = ABC] s1 = test01 s2 = 10 s1 = test02 s2 = 20 s1 = test03 s2 = 30 str = [DEF] structName = DEF] s1 = test04 s2 = 40

  • 沢山の変数を扱う時、うまく出来ません・・。

    変数が沢山ある時、エラーが起こったかどうかは どうやって判断したらいいんでしょうか。 今50個位変数名があるとします。 今は端おって5つにします。 int a,b,d; char c,e a = (int *) calloc(500,sizeof(int)); b = (int *) calloc(200,sizeof(int)); c = (char *)calloc(700,sizeof(char)); d = (int *) calloc(400,sizeof(int)); e = (char *)calloc(100,sizeof(char)); if(a==NULL || b==NULL || c==NULL || d==NULL || e==NULL)   printf("エラー発生\n"); こうやって50個もif文の中にいれたら大変ですよね。 変数名も長いですし。うまく1つでもエラーが起きたら全体がエラーになるように出来ませんかね? 自分としてはこういう風に考えたんですけど int sum=1; a = (int *) calloc(500,sizeof(int)); sum*=a; b = (int *) calloc(200,sizeof(int)); sum*=b; c = (char *)calloc(700,sizeof(char)); sum*=c; d = (int *) calloc(400,sizeof(int)); sum*=d; e = (char *)calloc(100,sizeof(char)); sum*=e; if(sum==0)   printf("エラー発生\n"); コレくらいしかないですかね?

  • データを読み込み

    データを読み込んで、表示するというものですが、 実行するとなぜか各行を読み込んだあとに 改行が入ってしまいます。 わかる方は何かアドバイスをお願いします。 ===================================== #include <stdio.h> #include <stdlib.h> #include <string.h> char filename[15], string[81]; main(){  FILE *fp = 0;  printf("input file:");  scanf("%s", filename);  if( (fp=fopen( filename, "r")) == NULL ){   printf("%s:don't open file", filename );   exit( 1 );  }  while(fgets( string,81, fp ) != NULL ){  printf("%s", string);  }  fclose( fp );  return 0; } =========================== test.dat : 80byte/rec =========================== 01234567890123456789012345678901234567890123456789012345678901234567890123456789 00000000000000000000000000000000000000000000000000000000000000000000000000000000 11111111111111111111111111111111111111111111111111111111111111111111111111111111

  • 文字列を分解して特定の項目を別の変数に

    文字列を分解して特定の項目を別の変数に入れたいのですが、条件式を満たさないので別の変数に入れれません 下にソースを書くのですが age の項目だけ別の変数に入れたいのです どのようにすれば入れれますか? #include <stdio.h> #include <string.h> char *nameset[12],*valueset[12]; char *nameset3[12],*valueset3[12]; void main(void){ int c=0; int i=0,cn=0,dn=0; char *tm=NULL; char *han; char *a="name=miku&age=15&like=momo"; int b=strlen(a); nameset[0]=a; while((a[++i]!=NULL)&&(i<b)){ /* 項目の分解 */ if(a[i]=='='){ a[i]=NULL; if(c!=1){ valueset[cn]=a+i+1; cn++; } else{ valueset3[dn]=a+i+1; dn++; c=0; } } /* データ項目で分解 */ else if(a[i]=='&'){ a[i]=NULL; han=a+i+1; if(strcmp(han,"age")==0){ nameset3[dn]=han; c=1; } else{ nameset[cn]=han; } } } printf("%s\n", nameset[0]); printf("%s\n", valueset[0]); printf("%s\n", nameset[1]); printf("%s\n", valueset[1]); printf("%s\n", nameset[2]); printf("%s\n\n", valueset[2]); printf("%s\n", nameset3[0]); printf("%s\n", valueset3[0]); }

  • C#のnull許容の警告について

    「Visual Studio」のNET6.0の環境でコードを書いています。 static string UserName; という変数の宣言に対して 「null非許容のフィールドUserNameには、コンストラクターの終了時にnull以外の値が入っていなければなりません。フィールドをNULL許容として宣言することをご検討ください。」 という警告を回避するために static string? UserName; というnull条件演算子で対応したのですが、上司に 「トリッキーな方法(?)ではなく、初期化や代入を使え」 と言われてしまい static string UserName = null ; という書き方を試したのですが 「nullリテラルをnull非許容参照型に変換できません」 という警告が出てしまい、警告を出さない書き方が分からず困っている状態です。 どなたか修正方法を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string UserName; static void Name() { Console.WriteLine("ユーザ名を入力してください"); string? enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); UserName = enterName; } 以下省略

  • fscanfで格納された変数がおかしいです。

    fscanfで格納された変数がおかしいです。 ダブルポインタで定義した変数にfscanfでファイルから文字列データを読み込んでいるのですが 表示がおかしな事になっています。 読み込んだファイルの内容は、 aiueo kakikueko sasisuseso tatituteto です。 表示された結果が kakikueko sasisuseso tatituteto kakisasitatituteto sasitatituteto tatituteto 自分では解決しずらいのでここで質問をさせて頂くことになりました。 C/C++で記述してあるのですが、以下にソースを載せておきますのでご指摘ください。 /* double pointa */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 256 char** size; // TEST void test(void) { for(int l = 0; l < 3; l++) { printf("\n%s", &size[l]); } } int main() { FILE* fp; int c = -1; char moji[MAXSIZE]; if((fp = fopen("test.txt","rb")) == NULL) { printf("error"); exit(1); } while(fscanf(fp,"%s",moji) != EOF) c++; size = (char**)malloc(sizeof(char) * MAXSIZE * c); // 初めに戻す fseek(fp, 0, SEEK_SET); // 最初の文だけ取り出す fscanf(fp,"%s",moji); // 一文を格納する for(int l = 0; fscanf(fp, "%s", &size[l]) != EOF; l++) { printf("\n%s", &size[l]); } printf("\n"); test(); fclose(fp); getchar(); free(size); return 0; } test関数内で表示するとおかしな結果がでるのですが何故かわかりません。 よろしくお願いします。