文字列の操作 – プログラミング – Home

通知
すべてクリア

[解決済] 文字列の操作


バンヴィ
 バンヴィ
(@バンヴィ)
ゲスト
結合: 18年前
投稿: 19
Topic starter  

いつもお世話になっています。
質問します。
VC++6.0、windowsXP、Win32にて開発しています。

行っている処理なんですが。

①既存ファイルの読み込み
②既存ファイルの変更

詰まっているのは、②の既存ファイルの変更です。

読み込んだファイルを配列に格納し順番に変更していくプログラムを作成しているので
すが、配列に格納した文字列を

char *text;

ここに格納し、変更していくと、変更してほしくない配列の中身まで変わってしまいま
す。これはなぜなのでしょう??

後もう一つ質問なのですが、

文字列の一番初めに文字列を追加したいのですが、なかなかうまくいきません。

例:absde に 123をついかして、

123abcdという感じにしたいのです。

ご教授お願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>読み込んだファイルを配列に格納し順番に変更していくプログラムを作成しているので
>すが、配列に格納した文字列を
>
>char *text;
>
>ここに格納し、変更していくと、変更してほしくない配列の中身まで変わってしまいま
>す。これはなぜなのでしょう??
なんだかよくわからないけど、コピーしていない単なる文字型配列のポインタを格納し
ているのであれば変更するのは当たり前のことですけど。

char str[10] = abc;
char* text = str;

text[0] = 'A';

は str が Abc になる。
(C言語のチョー基礎。)

mallocやnewをしてコピーを作ればコピー元が変わることはないです。

char str[10] = abc;
char* text = new char[strlen(str) + 1];
strcpy(text, str);

text[0] = 'A';

>文字列の一番初めに文字列を追加したいのですが、なかなかうまくいきません。
単純に考えるとstrcmp関数を使えばいいのですが、
どのようにしてtextという変数に入れているのかが問題でしょう。
(管理している領域以上に文字を入れられる可能性がある)

いろいろ面倒であれば、std::stringを使ったほうが楽チンでしょう。

#include <string>

std::string str = abc;
std::string text = str;

text[0] = 'A';
// str は abc, text は Abc となる。

text += efg;
// text は Abcefg となる。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

間違えました。
>単純に考えるとstrcmp関数
strcat関数でした。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

あれ、追加じゃなくて挿入やんけ。

>例:absde に 123をついかして、
> 123abcdという感じにしたいのです。
まぁ、どちらに対してstrcatするのかでしょうかね。
もしくは、sprintfを使うとか。

char str[10] = abc;
char* text = new char[strlen(str) + 1];
strcpy(text, str);

// text の先頭に 123 を挿入したい。
// ※text は4文字分しか入れれないので領域を拡張する必要がある
char ins[] = 123;

char* tmp = text;
text = new char[strlen(text) + strlen(ins) + 1];
strcpy(text, ins);
strcat(text, tmp);

delete[] tmp;

過去ログ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200702/07020046.txt
で挿入関数を作ったりしてもいる。


返信引用
バンヴィ
 バンヴィ
(@バンヴィ)
ゲスト
結合: 18年前
投稿: 19
Topic starter  

早速回答ありがとうございます。

>mallocやnewをしてコピーを作ればコピー元が変わることはないです。
何とかやってみます。

>strcat関数でした
何度か使用してみたのですが追加したい文字列が先頭にどうしても来なくて困っていま
す。

>text += efg;
これを参考に作成してみたのですが、
'+=' : 不正な右オペランドです
というエラーが出てしまいました。


返信引用
バンヴィ
 バンヴィ
(@バンヴィ)
ゲスト
結合: 18年前
投稿: 19
Topic starter  

入れ違いになってしまいました。

過去ログを参考にしてみます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>これを参考に作成してみたのですが、
>'+=' : 不正な右オペランドです
textはstd::stringの変数でしょうか?
char*に対してはまったく意味なしですよ。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

いまさらですが、char*で管理するよりもある程度大きな配列で管理したほうが
簡単になりますよ。

文字列のコピーはstrcpyを使えばいいですし。

char str[] = abcd;
char text[256];

// strの文字列をtextに入れる
// (=では代入できない!)
strcpy(text, str);

// http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200702/07020046.txt
// のinset関数を使うと...

// 先頭に123を挿入
insert(text, 123, 0);


返信引用
バンヴィ
 バンヴィ
(@バンヴィ)
ゲスト
結合: 18年前
投稿: 19
Topic starter  

おはようございます。

Blueさん昨日はたくさんのアドバイスありがとうございます。

Blueさんの過去スレを参考にしたところうまく作動しました。
お手数をおかけしました。

char* insert(char* str,const char* substr, const int index)
{
const int substrLen = strlen(substr);
char* insertPos = &str[index];

memmove(insertPos + substrLen, insertPos, strlen(insertPos) + 1);
strncpy(insertPos, substr, substrLen);

return str;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました