2

文字列の先頭を指す文字ポインターと、文字列の長さ未満のインデックスがあります。ここで、元の文字列の部分文字列を先頭からインデックスまたは上記の制約を持つ部分文字列を指すポインターを作成したいと考えています。それを成し遂げる方法を見つけるのを手伝ってください。コードの一部を次に示します。

char* ch="323+465";//this is the original string
int index=2;  //this is the index upto which I wish to create a substring, 
              // in java, it would have been ch.substring(0,3), if ch were a String

前もって感謝します。

4

5 に答える 5

1

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]);
}
于 2012-09-13T13:55:38.533 に答える
0

Java 部分文字列と同じ動作 (新しい文字列を割り当てます)

 char* res = (char*)malloc(index+2);
 strncpy(res,ch,index+1);
 res[index+1]='\0';

+ で区切ろうとしていることがわかります。 strtok を使用する方が簡単です。

 char ch[] ="323+465";
 char * res;
 res = strtok (ch,"+");
 // res= 323
于 2012-09-13T12:41:53.323 に答える
0

できません。これは、文字列リテラルを変更することを意味するためです。これは違法です。

別:

char ch[]="323+465";
int index=2;
ch[index] = '\0'; 
于 2012-09-13T12:39:23.950 に答える
0

適切な数の文字のコピーを作成します。

char * substr = malloc(index + 2);
strncpy(substr, ch, index + 1);
substr[index + 1] = 0;

// ...

free(substr);

元の文字列を切断しても構わない場合は、null バイトを挿入してください。

ch[index + 1] = 0;

奇妙な+ 1点は、インデックスが包括的であるように見えるという事実から来ていますが、これは一般的に悪い考えです。

于 2012-09-13T12:38:52.840 に答える
0

最初に、文字列リテラルへのポインターの代わりに char 配列を使用して、文字列を書き込み可能にします。それで

char ch[] = "323+456";

int idx = 2;
ch[idx] = 0; /* Now ch holds the string "32" */

index古典的な BSD関数との識別子の衝突は避けるべきです。それが私がidx代わりに使用した理由です。

このソリューションでは、元の文字列を変更しても問題ないと想定しています。そうでない場合は、最初に新しい文字列を割り当てる必要があります。

于 2012-09-13T12:41:29.577 に答える