- ベストアンサー
春期の基本情報技術者試験の問題について
基本情報試験の勉強の為に過去門を解いていたのですが 自分には分からない記述があったので質問しました 下記のプログラムの 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; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず 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を移動したかったということが目的となります
その他の回答 (1)
- goosyu
- ベストアンサー率58% (36/62)
秋の「基本情報技術者試験」受験されるのでしょうか,がんばって下さい。 本題 私は「while(bp > base && *--bp != '/');」を次の様に考えました。 // ループを抜ける条件に変換してみます。 while(1) { // 「(bp > base && *--bp != '/')」をNOTしてループ終了条件にする // if (bp <= base || *--bp == '/') break; // || でif文を分けます。 if (bp <= base) break; --bp; if (*bp == '/') break; }
お礼
回答ありがとうございます。 この場合while文の条件式の中でbpの値を 減算しているってことですよね?