
forループ内にif文があり,それがtrueであった場合,処理(処理1)後breakでforループを抜けます。ループが完結するまでif文に引っかからないでループを抜けた場合,別の処理(処理2)をしたいのです。しかし,処理1をした場合,処理2はしたくありません。しかし,breakで抜けた後でも処理2が実行されてしまいます。ループ内のif文がtrueの場合,フラグを立てておいて,ループを抜けたところで,そのフラグが立っていたら処理2をしないようにすればできますが,スマートではありません。何かスマートな方法はないものでしょうか。forループ以外のループを使ってもかまいませんが。
具体的には,文字列0がabc.jpgだったら,文字列1(フォルダー名)をNULL,文字列2(ファイル名)をabc.jpgとし,文字列0がc:\dir1\folder1\defgh.jpgだったら文字列1をc:\dir1\folder1\とし,文字列2をdefgh.jpgとする処理をしたいのです。
後ろから\を探していって,見つかったらそこで文字列を分け,最後まで見つからなかったら,文字列1をNULLとし,文字列2を元の文字列にするプログラムを考えました。
No.6ベストアンサー
- 回答日時:
言語によってはそのような機能があったりするけど, C だとどうやっても「いまひとつ」感がある.
一般論だと「フラグを使う」のが普通だと思うけど, なんとなくスマートさに欠ける気もする. あるいは, 状況によってはループの継続条件を使うこともできるけど, これも「同じ条件を複数回書く」のが気持ちわるい.
C++ だと例外を使っても同じようなことができるけど, これも不自然だしねぇ.
コメントありがとうございました。フラグを使うのが一般的なんですね。あとは,forループの前にifに引っかからない場合の処理をしておいて,ループ内でifに引っかかったら処理内容を修正することも考えました。これは,それがフラグを使うより非効率だったら意味がないので,吟味する必要があるとは思います。
No.10
- 回答日時:
まだ出てない方法としては、「ループ部分を関数に分ける」でしょうか。
breakの代りにreturnを使います。
void funcA(〜) {
for(〜) {
if( 〜 ) {
処理1
return ;
}
}
処理2
}
今回の場合だと、「\を探す関数」と「探索結果で処理を分岐」に分けると、だいぶ見栄えがよくなります。
int searchBackslash(〜) {
for(〜) {
if( 文字が見付かった ) {
return 見付かった場所;
}
}
return -1 ; /* 見付からなかったら-1を返す */
}
/*呼び出し側*/
int index ;
...
index = searchBackslash(〜) ;
if (index>=0) {
処理1
} else {
処理2
}
なんか「ダサい」のは仕方ないです。
C言語は古い言語なので。
コメントありがとうございました。古い言語にもかかわらず,たくさんの意見をいただけてうれしいです。ご提案の方法も,トータルでの効率を考えながら,今後のプログラミングの参考にさせていただきたいと思います。ありがとうございました。
No.9
- 回答日時:
>処理2のみ実行するスマートな方法を知りたいのです。
関数にして、break文をreturn文にする
ラベルAを適切な名前にして goto 文を使う
でも良いと思います
余談
昔、後藤先生の講義で、 goto文は安易に使うな とおっしゃって、学生たちが失笑したことがありましたっけ。
コメントありがとうございました。私のコンピュータ言語のスタートはFORTRANでした。その頃はgo to文の連発で,「スパゲッティプログラム」という言葉があったくらいです。「goto文は安易に使うな」という言葉にしたがった結果,自分としては見やすいプログラムが書けるようになったと感じています。

No.7
- 回答日時:
No5です。
こちらのほうが、多少まとまっているかも。#include <stdio.h>
#include <string.h>
int main(void)
{
char str0[] = "c:\\dir1\\folder1\\defgh.jpg";
char str1[256];
char str2[256];
int i;
int x;
for(i = strlen(str0)-1;i>=0;i--){
if (str0[i] == '\\') break;
}
x = i + 1;
strcpy(str1,str0);
str1[x] = '\0';
strcpy(str2,&str0[x]);
printf("<%s>\n",str0);
printf("<%s>\n",str1);
printf("<%s>\n",str2);
return 0;
}

No.5
- 回答日時:
>forループ外でフラグにより処理1,2を分ける(一方はif文内でもかまわない)方法ですね。
>同じifをforループ内と,外で2度やっているようなもので,ちょっと気持ちが悪いのです。
要は処理1、処理2をまとめて、一か所でやりたいということですね。
以下のようにしてはいかがでしょうか。ポイントはxの値です。xの初期値は0にしておきます。
xは文字列2へコピーするときの文字列0の開始位置です。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str0[] = "c:\\dir1\\folder1\\defgh.jpg";
char str1[256];
char str2[256];
int i;
int x = 0;
for(i = strlen(str0)-1;i>=0;i--){
if (str0[i] == '\\'){
x = i + 1;
break;
}
}
strcpy(str1,str0);
str1[x] = '\0';
strcpy(str2,&str0[x]);
printf("<%s>\n",str0);
printf("<%s>\n",str1);
printf("<%s>\n",str2);
return 0;
}
コメントありがとうございました。具体例につきましてはすでに解決しています。ご呈示のxを使う方法は参考になりました。ありがとうございました。

No.4
- 回答日時:
No3です。
>ただ,forループ内のifを満足した時処理1のみ,ifを満足しないでループが完結した時,処理2のみ実行するスマートな方法を知りたいのです。
No3にも書きましたが、予め文字列1をNULLクリアしておく方法はいかがでしょうか。
文字列1をNULLクリア
for(){
if (\が文字列0に存在する){
文字列1を設定
文字列2を設定
break
}
}
if (文字列1がNULL){
処理1
}
のようになるかと。
やはりお礼の所に書いた方が時系列的に見やすいですね。補足の場合は質問の下に表示されるのですね。ですので,お礼の所に書かせていただきます。
文字列のことは忘れてください。すでに解決しているので。本当に知りたいのは「forループ内のif文がtrueだった場合,処理1のみ,if文に一度もヒットしなかった時,処理2のみを行うスマートな方法」ということです。ご提案は基本的にはNo.2のご回答とおなじ,forループ外でフラグにより処理1,2を分ける(一方はif文内でもかまわない)方法ですね。同じifをforループ内と,外で2度やっているようなもので,ちょっと気持ちが悪いのです。

No.3
- 回答日時:
No1です。
for文のループとは、文字列0の後ろから¥を探すということですか。
そうであれば、最初に文字列1をNULLに設定しておいてはいかがでしょうか。
\があった場合は、文字列1はNULLでなくなります。
ループを抜けたとき、文字列1がNULLなら、最後まで見つからなかったケースを適用します。
別解ですが、このような場合、\を最後から探す関数があります。
strrchrがありますので、これを使ってみてはいかがでしょうか。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str0[] = "c:\\dir1\\folder1\\defgh.jpg";
char str1[256];
char str2[256];
char *p;
p = strrchr(str0,'\\');
if (p == NULL){
strcpy(str1,"");
strcpy(str2,str0);
}else{
strcpy(str1,str0);
*(str1+(p-str0+1)) = '\0';
strcpy(str2,p+1);
}
printf("<%s>\n",str0);
printf("<%s>\n",str1);
printf("<%s>\n",str2);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
整定時間
-
While文の終わりにセミコロンが...
-
文字列の読み込みに関して
-
最大時間計算量を求める問題な...
-
if文でスキップしたい場合は?
-
初心者の質問ですが
-
基本情報技術平成21年春午後問8...
-
do-while文が禁止される理由
-
プログラムの『軽い』と『重い...
-
Delphiで・・・
-
プログラムの解説をお願いします。
-
PIC のプログラムについて ど...
-
strtokを使用したループ内でのs...
-
Excel VBAで年度をまたぐ期間の...
-
C言語のプログラムみてください...
-
特定の文字列が出てくるまでの...
-
__asm int 3でのブレイクポイン...
-
Matlabを使った心理学実験
-
入力した数値を倍々するプログラム
-
fortran 論理変数? true
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
Excel VBAで年度をまたぐ期間の...
-
C言語forループが完結した場合...
-
UWSCにてある一定の動作を無限...
-
入力した文字列から母音だけを...
-
excel VBA if文について
-
プログラムで関数は使わない方...
-
C++のvolatileについて
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
break文でループを一気に抜ける...
-
Delphiで・・・
-
if文の中にfor文なのか、for文...
-
for文while文の無限ループの違...
-
PIC のプログラムについて ど...
-
他言語で言うcontinue文
-
PAD図の書き方
-
C言語、whileループを抜け出す...
-
clock関数を利用した時間計測法...
おすすめ情報
neko_deuxさん,コメントありがとうございました。
No.1のお礼に書いたような一般的な方法を知りたかったのです。実は,具体的な例につきましては,strrchr()を用いて自分では満足行くコードを書くことができました。
とにかく,forループ内にif文があり,ループの最後に至る前にif文を満足した場合は処理1だけを,ループの間,全くif文を満足しなかった場合処理2だけを実行する方法を知りたいのです。昔だったらgoto文を使っちゃいますがスマートではないですね。
for(…){
…
if(…){
処理1
goto A
}
…
}
処理2
(ラベルA)
すみません,No.1のところで,補足に書くべき所をお礼に書いてしまいました。下の補足に書きましたが,strrchrを使って具体例はすでに解決しています。ただ,forループ内のifを満足した時処理1のみ,ifを満足しないでループが完結した時,処理2のみ実行するスマートな方法を知りたいのです。
No.12さんの回答は,「フラグを立てなくても,breakで抜けたか,forループを完結したか判断できるよ」ということでしたか。