3 つの文字列を作成せずにそれを行うことはできません。char ポイントは文字列の先頭のみをマークするため、ポインターとインデックスを組み合わせて新しい型にする必要があります。C には文字列がないことを思い出してください。Java (およびその他) のような言語では、いずれにせよ部分文字列のコピーが作成されます。
struct pseudo_string { char *s, int index; } vstring[3];
char* ch="323+465";
vstring[0].s = ch;
vstring[0].index = 2;
vstring[1].s = ch + index + 1; // weird
vstring[1].index = 1;
vstring[2].s = vstring[1].s + 1;
vstring[2].index = 2;
したがって、それは過度に複雑で役に立ちません。この場合、インデックスはカウンターとして使用されています...
同じベース ポインターを保持する場合は、2 つのインデックスまたは 1 つのインデックスと len が必要になります。
struct pseudo_string2 { char *s; int start; int end; };
しかし、それは小さな文字列にはやり過ぎです。
malloc を使用したくない場合は、マトリックスを使用してみてください。
char vstring[3][10]={0};
strncpy(vstring[0], ch, 3);
strncpy(vstring[1], ch+3, 1);
strncpy(vstring[2], ch+4, 3);
数バイトを無駄にしても、行列の利点は、割り当てを解除する必要がないことです。ただし、これらの値をこの関数の外で使用する必要がある場合は、malloc と free を使用する以外に別のスケープがありません (そのためのグローバルを考慮しないでください ;-)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * substr(char *s, int start, int end)
{
int size = end - start + 2; // 1 for the inclusive limits and another 1 for the \0
char * r = (char*)malloc(size);
strncpy(r,s+start, size-1);
r[size-1]=0;
return r;
}
int main()
{
char* ch="323+465";
char *parts[3];
parts[0] = substr(ch, 0,2);
parts[1] = substr(ch, 3,3);
parts[2] = substr(ch, 4,6);
printf("%s %s %s\n", parts[0], parts[1], parts[2]);
free(parts[0]);
free(parts[1]);
free(parts[2]);
}