C言語を勉強中です。質問させてください。
data = "abcwofjiabcajd9abfuabcaoefabc";
という変数があったとします。
変数dataに"abc"が存在したら"xxx"に書き換えたいのですが、
どうのようにすればいいのでしょうか?
------------------------------------
こうしたいです↓。
data = "xxxwofjixxxajd9abfuxxxaoefabc";
------------------------------------
宜しくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#2さんのコードで一点だけ気になる所があります。
それは、>char *data = "abcwofjiabcajd9abfuabcaoefabc";
という一文です。この場合、後ろのfor文で文字列リテラルを書き換える事になるかと思いますが、文字列リテラルは一般的には書き換え不可です。環境によってはクラッシュする可能性があります。素直に配列を使って
char data[] = "abcwofjiabcajd9abfuabcaoefabc";
としておくと良いでしょう。(他の部分はそのままで構いません。)
参考URL:http://www.catnet.ne.jp/kouno/c_faq/c16.html#6
No.3
- 回答日時:
#1です。
>恐らくですが、上記のソースだと無限ループになるのですか?
>書き換えた文字列を見ていないような気が・・・
その点は大丈夫です。
回答した後気になって、実際にコンパイルして試してみました。正常に動きます。
>while(p = strstr(data, "abc"))memcpy(p, "xxx", 3);
このコードで何をやっているか説明いたしますと、
・strstr()によって"abc"を検索している。あればそのポインタを返し、なければNULLを返す。
・NULLを条件として判断すると、falseになる。検索するものが文字列dataの中に無ければwhileから出る。あれば動作する。
・while文の条件判断の中で、検査とpへの代入を同時に行っている。Cでは許される書き方。(ただしあまり好ましくはない)
・ポインタpは文字列dataのある位置("abc"が見つかった位置)を指している。ここに対して文字列コピーをすると文字列dataが変更される。
というわけで動作はするのですが、
書き方的にはあまりよくなかったですねえ。
#2のコードの方がいいです。基本に忠実で。効率の点でも。
こっちは「こういう書き方もあるんだな」と参考だけにしてください。
No.2
- 回答日時:
C言語は文字列処理苦手ですからねえ。
こんな置換でも結構めんどいです。
こんな感じでいかかがでしょう。
#include <stdio.h>
int main()
{
char *data = "abcwofjiabcajd9abfuabcaoefabc";
char *wk;
for(wk=data ; *wk ; wk++ ){
if( !strncmp(wk , "abc" , 3) ){
strncpy( wk , "xxx" , 3 );
}
}
printf("data = [ %s ] \n" , data );
}
No.1
- 回答日時:
検索には、標準関数strstr()を使います。
文字列のコピーには、通常はstrcpyを使いますが、
strcpy()だと、文字列最後の\0までコピーされてしまうので適当ではありません。
この場合memcpy()かstrncpy()を使います。
コンパイルしてないので自信はなしです。
#include <string.h>
char *p;
while(p = strstr(data, "abc"))memcpy(p, "xxx", 3);
この回答への補足
早速の返信有難うございます。
恐らくですが、上記のソースだと無限ループになるのですか?
-------------------------
#include <string.h>
char *p;
data="abcadjfoiabapdoabcajodjfiabc"
while(p=strstr(data, "abc")){
memcpy(p, "xxx", 3);
}
→"xxxadjfoiabapdoxxxajodjfixxx"
-----------------------------
あまりC言語は詳しくないのですが、
書き換えた文字列を見ていないような気が・・・
間違っていたらすみません。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) 何方か知恵をください… 下記のシート1にシート2のDATAを表示させたいです。 (シート1の2行目の 6 2022/03/28 17:27
- 数学 Pythonのspecgramに関する質問です。 1 2022/12/04 19:18
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
- 英語 data について 6 2023/03/25 11:05
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
文字列str内の全ての数字を...
-
C言語 strstrの実装
-
CStringからchar*への型変換に...
-
DWORDとcharの変換
-
文字列のswap
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
strcat関数を自作したいです
-
動的メモリの初期化方法について。
-
char** buffer (このような2...
-
C# ポインタ アクセス違反
-
36進数
-
C言語 動的なメモリの確保 実...
-
警告
-
なぜ?counterintuitive
-
C言語 配列の長さの上限
-
セグメントエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
小数点入りの文字列をfloat型に...
-
szとlpszの違い
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
おすすめ情報