http://1.1.1.1/test.mpg
のようなリンクがあるとします。次に、それをhttp://1.1.1.1/test.mkv
に変更します。どのようにCで "mpg"を "mkv"にプログラム的に変更できますか?私はstrtokとstrcpyを使用しようとしましたが、C言語ではうまくいかないため、できませんでした。const char *をCの別の文字列に置き換えるには?
答えて
以下は解決策ですが、実験のために残したことが1つあります。
malloc
メモリがfree
ではありません。あなた自身で試してみてください!
もう1つの欠点は、文字列の最初の出現箇所だけを置き換えることです。このコードを改善して、文字列のすべての出現箇所を置き換えます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * strrep(char *str, char *o_s, char *n_s)
{
char *newstr = NULL;
char *c = NULL;
/* no substring found */
if ((c = strstr(str, o_s)) == NULL) {
return str;
}
if ((newstr = (char *) malloc((int) sizeof(str) -
(int) sizeof(o_s) +
(int) sizeof(n_s) + 1)) == NULL) {
printf("ERROR: unable to allocate memory\n");
return NULL;
}
strncpy(newstr, str, c-str);
sprintf(newstr+(c-str), "%s%s", n_s, c+strlen(o_s));
return newstr;
}
int main(void)
{
char str[] = "http://1.1.1.1/test.mpg";
char old_s[] = "mpg";
char new_s[] = "mkv";
char *str_new = strrep(str, old_s, new_s);
if (str_new != NULL) {
printf("Original : %s\n", str);
printf("Replaced : %s\n", str_new);
}
return 0;
}
$ gcc strrep.c
$ ./a.out
Original : http://1.1.1.1/test.mpg
Replaced : http://1.1.1.1/test.mkv
$
ありがとうございました。 – sjor
const char *
からの文字の変更は、コンパイラによって許可されてはならず、明示的キャストによってchar *
に変更されると、未定義の動作につながります。
あなたがいずれかのグローバルまたはスタック上に格納された配列として文字列を宣言する場合:
char str[] = "http://1.1.1.1/test.mpg";
次にあなたがconst char *
に対処し、文字を変更していないがOKです。それ以外の場合は、
char *str = "http://1.1.1.1/test.mpg";
文字列リテラルは、おそらく、プロセスの読み取り専用の保護地域と、おそらく保護違反が発生します書き込もうに保存されます。
+1ですが、それは "先行すべき"ではありませんが、未定義の振る舞いにつながります。 –
私がまだやったことを見せてあげましょう:(const char * urlは関数のパラメータです。)int len = strlen(url); const char * last_three =&url [len-3]; char str [512]; char * ptr; strcpy(str、url); strtok_r(str、last_three、&ptr); strは "h"を返します – sjor
const char *
ポインタは変更できません。これは、const
で示されています。これは、このポインタが定数文字を指していることを明らかに示しています。
この変数で何かをプログラムで変更する必要がある場合は、最初にそれを十分なサイズの別の変数にコピーして変更します。このためには、配列インデックスを使用して最後の数バイトを変更することができます。このような何かが動作します:
const char * url = "http://1.1.1.1/test.mpg";
char * url2;
url2 = malloc(strlen(url) + 1);
strcpy(url2, url); // no need to use strncpy
url2[ strlen(url2) - 3 ] = 'm';
url2[ strlen(url2) - 2 ] = 'k';
url2[ strlen(url2) - 1 ] = 'v';
注「MKV」と「MPG」の長さが同じであるため、この場合には、これが唯一、そうsmoothely動作すること。そうでなければ、もっと複雑なテクニックが必要です。
- 1. 文字列を別の文字列に置き換えます
- 2. 2D char * arrayの文字列値の置き換えc/java jni
- 3. ベクトルに格納された文字列を文字に置き換えて文字を置き換えるC++
- 4. const unsigned char *文字列またはconst char *への変換/ *
- 5. Cで別の文字に置き換えるプログラム
- 6. 文字列内の1文字を別の文字列に置き換える
- 7. C#最後の文字を別の文字列に置き換えます。
- 8. 2文字をchar配列の1文字に置き換える
- 9. 文字列に別の配列から文字を置き換え
- 10. char []の配列文字を変更して置き換える
- 11. 文字列内の文字を別の文字に置き換える方法
- 12. SQLのテーブルの文字列を別の文字列に置き換える
- 13. C++文字列、文字 'b'を削除し、文字 'a'を2つの 'd'に置き換えるビルド関数
- 14. 文字列をテキストに置き換えるC言語
- 15. sscanfエラー: '文字列'を 'const char *'に変換できません
- 16. 文字列内である文字を別の文字に置き換えたり、逆の文字を文字列に置き換えたりします。
- 17. C++ doubleをcharに置き換えてstd :: arrayに置き換えます。
- 18. 値を別の文字列に置き換える
- 19. C++配列内の文字列を別の文字列に置き換える方法
- 20. charをC++の文字列に変換するには?
- 21. 文字列を別の結果に置き換えます。
- 22. 文字列Cの制御文字を置き換えます。
- 23. C++ char配列のコピーをunsigned char配列に置き換えます。
- 24. Pythonは文字列(大文字または小文字)を別の文字列に置き換えます。
- 25. Javascriptを - 文字列複数の文字列に置き換え
- 26. 文字列をBeautifulSoupの文字列に置き換えます。
- 27. 文字列の数字を置き換える - C#
- 28. C++のstd ::文字列内の文字/シーケンスを別の文字シーケンスに置き換えます。
- 29. 文字列を部分文字列に置き換える
- 30. C#大きな文字セットの繰り返しでのChar置換文字列
C言語ではBoostのRegExライブラリを使うことができるので、Cの代わりにC++が使用されています。 –
私はcppを使用しています。しかし、c関数もこれを行うことができます。 – sjor
cppを使用している場合は、絶対にする必要がない限り、 'const char *'を使わないでください。代わりにstd :: stringを使用してください。 – LiKao