これが私のコードです
char* a[10];
a[0]="'example'";
char* p;
p=strstr(a[0],"'");
strstrがそれを見つけることができるかどうか'
は、最初の文字である。を指すポインターを返すことを知っています'
。'
2つの間の値を取り、それをに保存したいと思いますa[1]
。どうすればいいですか?結果
a[1]
として"example"
。
strchr()
というより適切な選択のようstrstr()
です。
first strchr()
, + 1
, の結果を、後続のstrchr()
and then malloc()
and strcpy()
or sprintf()
into への引数として使用しa[1]
ます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* a[10];
char* p;
a[0] = "'example'";
p = strchr(a[0], '\'');
if (p)
{
char* q = strchr(++p, '\'');
if (q)
{
a[1] = malloc((q - p) + 1);
if (a[1])
{
sprintf(a[1], "%.*s", q - p, p);
printf("[%s]\n", a[1]);
}
}
}
return 0;
}
文字列リテラルへmalloc()
のポインタとデータを同じ配列に格納するのは、危険なことのように思えます。free()
動的にメモリを割り当てる必要がありますが、動的に割り当てられたメモリのみです。a
コードは、 のどの要素が動的に割り当てられたメモリを指しているのかを知る必要がfree()
あります。
a
すべての s に初期化してNULL
、どの要素が入力されているかがわかるようにします。
char* a[10] = { NULL };
ポインターの呼び出しfree()
はNULL
安全です (何もしません)。
の次の出現を見つけて'
、部分文字列をコピーするだけです。
char* a[10];
a[0]="'example'";
char* p, *q;
p=strstr(a[0],"'");
if (p) {
q = strstr(p+1, "'");
if (q) {
size_t len = (size_t)(q - p);
char *sub = malloc(len + 2);
if (!sub) {
/* Oops */
exit(EXIT_FAILURE); /* Something more sensible rather */
}
memcpy(sub, p, len+1);
sub[len+1] = 0;
a[1] = sub;
}
else {
a[1] = NULL;
}
}
else {
a[1] = NULL;
}
この場合、strchr
単一の文字を検索するために使用する方がよいことに注意してください。