![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
文字列を引数にしたがって置換するプログラムを作りました。
test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ
引数 : abc=zz mnopq=u
- 出力結果 -
zzdefghijklurstuvwxyz
というような結果になるプログラムを作ったのですが、これをstr系とmem系の関数を使わずにポインタを使って組みなおしたいと思うのですが、全くわからないので質問させて頂きました。
よろしくお願いします。
質問下手なので質問でダメな点があれば随時補足していきたいと思います。
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 128
#define MOJI 128
#define MAX 128
#pragma warning(disable : 4996)
using namespace System;
int main(int argc, char *argv[])
{
FILE *fp;
char txt[BUF];
char hiki_mae[MAX][MOJI];
char hiki_ato[MAX][MOJI];
int i = 0, n = 0, j = 0;
int hiki_num = 0;
char txt_mae[BUF], txt_ato[BUF];
char *p;
char sagyou_txt[BUF], sagyou_argv[MAX][MOJI];
if(argc < 2){
printf("argc = %d >>> パラメータ不足です\n", argc);
exit(1);
}
if( (fp = fopen("test.txt", "r")) == NULL ){
printf("ファイルがオープンできません\n");
exit(1);
}
for(i = 1; i < argc; i++){
if( strchr(argv[i], '=') != NULL && strlen(argv[i]) > 2){
strcpy(sagyou_argv[hiki_num],argv[i]);
p = strstr(sagyou_argv[hiki_num],"=");
*p = '\0';
strcpy(hiki_mae[hiki_num], sagyou_argv[hiki_num]);
strcpy(hiki_ato[hiki_num], sagyou_argv[hiki_num] + strlen(hiki_mae[hiki_num]) + 1);
hiki_num++;
}
}
while( fgets(txt, BUF, fp) != NULL){
printf("変換前>%s\n",txt);
}
for(n = 0; n < hiki_num; n++){
while( strstr(txt, hiki_mae[n]) != NULL ){
strcpy(sagyou_txt, txt);
p = strstr(sagyou_txt, hiki_mae[n]);
*p = '\0';
strcpy(txt_mae, sagyou_txt);
strcpy(txt_ato, sagyou_txt + strlen(txt_mae) + strlen(hiki_mae[n]));
strcat(txt_mae, hiki_ato[n]);
strcat(txt_mae, txt_ato);
strcpy(txt, txt_mae);
}
}
printf("変換後>%s\n",txt);
fclose(fp);
return 0;
}
No.3ベストアンサー
- 回答日時:
代替関数が出来ていて、なおかつ関数を使わずに記述したいというのであれば、その関数の中身を関数を使用している部分に展開すればいいだけです。
あるいは関数じゃなくてマクロにするという方法もありますが、これは意図するものじゃないでしょう。
該当の関数はずいぶん使っているみたいですから、全部展開するとかなり冗長なソースになりそうですが、頑張ってください。
注意点としては、関数ならその引数や中のローカル変数は独立したスコープの変数なので(ポインタで受け渡ししているもの以外は)関数の外部を意識する必要はありませんが、関数ではなく直接処理を記述する場合はその前後の処理との間で変数の取り扱いをきちんと考える必要があります。
ま、該当処理の部分を{}でくくってその中だけのローカル変数を使うとかいう方法もありますが。
No.4
- 回答日時:
なぜ関数を呼ばないように書き換えたいと思ったのか分かりませんが、一般的なアドバイスとしては「デメリットが多いのに比べてメリットはほとんどないのでお勧めしない」ということになります。
- 展開しようとしている各関数は複数回呼ばれているものが多いので、展開するとコードサイズが無駄に増える
- 手動で各関数を展開する際に書き間違えやすい
- 関数内に複数のreturn文があったりループの中からreturnしていたりする場合、それを展開しようとするとgotoを使う必要が生じたりしてきれいに書けない
- 展開後のソースコードは冗長で読みにくい
- 後から関数の仕様を変更したいとかバグを見つけて修正したいと思ったとき、複数の場所に展開されていると全てを正しく修正するのは面倒だったり見落としが生じたりする
No.2
- 回答日時:
回答しようがなかったので補足をお願いします。
質問内容は何ですか?
組み直したいと思うがそれが実現可能かどうか知りたい、なのか
いっそ答え(組み直し後のソースコード)を提示してほしい、なのか
不明部分のヒントがほしい、なのか
はっきりしないので、何を回答すればいいのかが見えませんでした。
また、「全く分からない」とはどこが全く分からないのでしょう?
もう少し不明点を明確化できないでしょうか?
質問欄のソースコードにポインタが含まれることから
「ポインタって何ですか?」というレベルではないと思います。
strcpyと同じようなことをする処理を作れない、なのか
strcpyと同じような処理はできるがそれを関数化する方法が分からない、なのか
処理を作れないし関数化の方法も分からない、なのか
はっきりすれば回答もしやすくなります。
> test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ
質問欄のソースコードにそれらしい処理はありませんが、
これはプログラムを動かす前にこういう下準備をしておけという内容でしょうか?
この回答への補足
回答ありがとうございます。
> test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ
これはエクスプローラー上でテキストファイルを作成しておくという意味です。言葉が足りなくて申し訳ありません。
質問としては今までstrcpy関数等を使っているところを使わないで書きたいということになります。
例えば
>strcpy(hiki_mae[hiki_num], sagyou_argv[hiki_num]);
という部分をstrcpy関数を使用しないで書くとどうなるか教えていただきたいと思います。
自作したstrcpy関数に近いものがあるのですが、これをソースコードのstrcpy関数がある行にstrcpy関数の代替えとして使用したい場合(関数としての使用ではなく)、どういう風に書けばいいのか教えていただきたいです。
↓自作strcpy関数
char *MyStrcpy(char *str1, const char *str2)
{
char *p1 = str1;
const char *p2 = str2;
while( *p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
}
if(*p2 == '\0'){
*p1 = *p2;
}
return p1;
}
No.1
- 回答日時:
質問番号6245803と6249995の人ですね。
strlen, strcat, strcpy, strstr, strchrの代替関数は自作できたということなので、それらの関数を呼ぶように書き換えればいいだけなのでは?
正しく動くかどうかの確認はしていません。
この回答への補足
回答ありがとうございます。
前回の質問にて代替関数は完成いたしました。また、それを使用すれば今回の質問内容はクリア出来たのですが、今回は関数化をしないで組みたいと思っています。
今まで関数の引数として渡していたもの等をどうやって書き換えれば良いのかわからなかったため今回は質問をさせていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パソコン
-
これて逆じゃないですか?
-
あんまり考えたくないけど
-
C言語について。
-
C言語について。
-
コンソールアプリを作成するの...
-
C言語について。
-
アンリアルエンジン5に関して、...
-
大量のデータを読み込んで表示...
-
c言語の問題の説明、各所ごとに
-
次の日本語の意味を教えて下さい
-
バッチファイルで以下のような...
-
c#のTLS1.2での通信について
-
c言語の問題です
-
ハミング符号の解読について
-
C言語初心者 構造体 課題について
-
C#,vb.netで業務用アプリ開発と...
-
C言語の質問です。バイナリ形...
-
C言語初心者です、、、お助けく...
-
C# でソフト開発をした事のある...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理 特定の文字以降を...
-
VBA テキストボックスを選択状...
-
Access VBA エラー2448について
-
[コンパイルエラー 修飾子が不...
-
verilog HDLについての質問です...
-
SQLでテキストボックスの文字を...
-
型の値をDataGridViewセルに変換...
-
teratermで、ファイル名をinput...
-
フォームのResizeイベントについて
-
MS-DOSバッチファイルコマンド...
-
複数の数字が書かれた文字列をs...
-
分数の計算のプログラミングです。
-
エクセルVBAで公用宣言した...
-
ruby テキストファイル書き出し...
-
言語[RUBY]を用いて、特定列を...
-
Fileの読み込み処理について
-
バッチファイル フォルダ名をフ...
-
バッチ for /f 空白、スペース...
-
プログラミングによるオセロゲ...
-
キーが重複しているデータの統...
おすすめ情報