Cを始めたばっかりのものです。
いままでPerlとPHPでCGIを書いてますが、それをCに書き換えています。
今のところフォームをデコードして、nameを入れるとvalueを返す関数をつくって、さあこれから、という状況です。
基本的な質問ですが、Cには文字列の置換をしてくれる関数ってありますか?
たとえば、標準のライブラリに入ってなくても、どっかからダウンロードできるとか。
なければstring.hに入っている関数を使って自分で作ろうかと思ってますが、作った後に、“xxxxをつかったら一発でできるじゃん”という発見がすごいショックで、今までもなんどもありましたので、おたずねします。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
> これでなぜ漢字コード非対応なのかがよくわかりません。
置き換えられる対象文字(substr1)が1バイト文字1文字ではなく、2文字以上もしくは2バイト文字だったら文字コードが重なる可能性が少なくて、strstrでも2バイト文字の1バイト部分を切ったりしないと考えて大丈夫ですか?この点については漢字コードの種類に依存します。例えばシフトJISの場合、2バイトのうちの1バイト目と2バイト目のコードの範囲は重なっています。このため、ある漢字1文字をsubstr1に指定した場合、2文字続く2バイト文字(全4バイト)の中央の2バイトが置換されてしまう可能性があります。また、一般には2バイト文字は1バイト文字と混在しているので、問題はさらに複雑になります。私はあまり詳しくないのですが、シフトJIS以外の漢字コードも同様の問題を抱えていると思います。
No.4
- 回答日時:
#3の者です。
StrReplace()の置換処理部分を変更させてください。こちらの方が少しわかりやすいので。------------------------------------------------
/*置換処理*/
while ((q = strstr(p, substr1)) != NULL) {
/*置換しない部分のコピー*/
strncpy(r, p, q - p);
r += (q - p);
/*置換文字列のコピー*/
strcpy(r, substr2);
r += len2;
/*検索開始位置の更新*/
p = q + len1;
}
strcpy(r, p); /*最後の部分のコピー*/
この回答への補足
ありがとうございます。
大変参考になります!
これでなぜ漢字コード非対応なのかがよくわかりません。
置き換えられる対象文字(substr1)が1バイト文字1文字ではなく、2文字以上もしくは2バイト文字だったら文字コードが重なる可能性が少なくて、strstrでも2バイト文字の1バイト部分を切ったりしないと考えて大丈夫ですか?
もしよろしければご回答よろしくお願いします。
No.3
- 回答日時:
C言語で文字列置換をするような標準関数はなかったと思います。
ちょっと面倒だと思いつつも自作してみたので参考にしてください。ただ、いろいろと不完全だと思うので注意してください。(漢字コード非対応とか) なお、インデントには全角空白を使っています。-------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int StrCount(const char *str, const char *substr);
void StrReplace(const char *input, const char *substr1, const char *substr2, char *output);
int main(){
char *string = "acabcdeabced";
char *substr1 = "ab";
char *substr2 = "XYZ";
char *output;
size_t outSize;
size_t len, len1, len2;
int count;
/*出力領域の確保*/
len = strlen(string);
len1 = strlen(substr1);
len2 = strlen(substr2);
count = StrCount(string, substr1);
outSize = len + count * (len2 - len1) + 1;
output = (char *)calloc(outSize, sizeof(char));
if (output == NULL) {
return 1;
}
/*置換処理*/
StrReplace(string, substr1, substr2, output);
/*確認*/
printf(string);
printf("\n");
printf(output);
printf("\n");
/*終了*/
free(output);
return 0;
}
/*部分文字列の出現回数を調べる*/
int StrCount(const char *str, const char *substr){
const char *p = str;
int cnt = 0;
size_t len;
len = strlen(substr);
while ((p = strstr(p, substr)) != NULL) {
cnt++;
p += len;
}
return cnt;
}
/*文字列の置換処理*/
void StrReplace(const char *input, const char *substr1, const char *substr2, char *output){
size_t len1, len2;
const char *p = input;
const char *q = input;
char *r = output;
/*初期化*/
len1 = strlen(substr1);
len2 = strlen(substr2);
/*置換処理*/
while ((p = strstr(p, substr1)) != NULL) {
/*置換しない部分のコピー*/
strncpy(r, q, p-q);
r += (p-q);
/*置換文字列のコピー*/
strcpy(r, substr2);
p += len1;
q = p;
r += len2;
}
strcpy(r, q); /*最後の部分のコピー*/
return;
}
No.1
- 回答日時:
すみません、今手元に資料がないので詳細はわかりません。
ポインタとstrcpy関数を使えば出来ます。
strcpyのパラメタの詳細を忘れてしまったので。
多分
char * strcpy(char * コピー先, char * コピー元)
だったような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- PHP $_SESSIONに渡した後はそのまま使っても問題ありませんか? 3 2022/11/08 22:17
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/06/23 15:02
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
c++ 文字列を入力して、一文字...
-
C言語のfor文です。 繰り返しの...
-
enumの記述について。
-
プログラムを作成(c言語)
-
'const char *' 型は 'char *' ...
-
下記のプログラムがコンパイラ...
-
int main()の・・・
-
Linuxでフォルダ内全ファイル名...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
【C言語】文字型と整数型の違い
-
pingの結果を取得する方法
-
strlen関数と同じ働きをする関...
-
sprintf関数の作り方
-
atoi( ) の反対をやりたい
-
C言語 共用体について コマンド...
-
3桁区切(コンマ)記号をつけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報