• ベストアンサー

春期の基本情報技術者試験の問題について

基本情報試験の勉強の為に過去門を解いていたのですが 自分には分からない記述があったので質問しました 下記のプログラムの while(bp > base && *--bp != '/'); とは一体どのような処理をしているのか教えてください C言語は独学で勉強したのですがこのようなwhile文の 使用方法はどこにものっていなかったので・・・ よろしくお願いします。 問題は平成21年春期の基本情報技術者試験の 午後の問9です。 #include <string.h> void convert(const char*, const char*, char*); void convert(const char *path, const char *base, char *result){ const char *pp, *bp; char *rp; int length; /* pathが絶対パス表記の場合 */ if(*path == '/'){ ; return; } /* pathがカレントディレクトリの場合 */ if(!strcmp(path, ".") || !strcmp(path, "./")){ ; return; } length = strlen(base); bp = base + length; /* bpは文字列baseの終端を指す。*/ if(*(bp - 1) == '/') --bp; /* pathの先頭部にある".."又は"../"を解析することで, baseのパス表記のうち,どこまでresultと共通になるかを調べる。*/ for(pp = path; *pp != '\0' && *pp == '.';){ if(!strncmp(pp, "../", 3)){ pp += 3; while(bp > base && *--bp != '/'); }else if(!strncmp(pp, "./", 2)){ pp += 2; }else if(!strncmp(pp, "..\0", 3)){ pp += 2; while(bp > base && *--bp != '/'); }else{ break; } } /* baseのパス表記と共通な部分をresultに複写する。*/ length = ; strncpy(result, base, length); rp = ; *rp++ = '/'; /* pathの文字列のうち,先頭部分の"./"や".."を除いた残りの 部分(ppが指す文字列)を,resultの文字列に追加する。 */ strcpy(rp, pp); return; }

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

  • ベストアンサー
  • jppy
  • ベストアンサー率14% (14/99)
回答No.1

まず int i=1000; /* int型のiの初期化 */ while(--i); /* iをデクリメントしてi=0(whileの判断が偽になったらループを抜ける) */ これはOK? んで質問は  while(bp > base && *--bp != '/'); ですね  1.bp:ポインタですね  2.*--bp:これでポインタを移動させています。  3.bpをずらしながら、      bp > base (先頭を超えない)      かつ      *--bp != '/' (後ろから「/」がでるまで)    の条件が破たんするのを待っています  4.while配下に処理なしです じゃあ何がしたいのかということですが、   bpを移動したかったということが目的となります

gowogowo
質問者

お礼

回答ありがとうございます。 この場合while文の条件式の中でbpの値を 減算しているってことですよね?

その他の回答 (1)

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.2

秋の「基本情報技術者試験」受験されるのでしょうか,がんばって下さい。 本題 私は「while(bp > base && *--bp != '/');」を次の様に考えました。 // ループを抜ける条件に変換してみます。 while(1) { // 「(bp > base && *--bp != '/')」をNOTしてループ終了条件にする // if (bp <= base || *--bp == '/') break; // || でif文を分けます。 if (bp <= base) break; --bp; if (*bp == '/') break; }

関連するQ&A