0

URL に挿入できるようにテキストをエンコードするプログラムを作成しています。ユーザーに文字列を入力してもらい、特殊文字 (#、%、&、? など) が含まれている場合は、それらを対応する文字コード (%23、%25、%26、%3F など) に置き換えます。問題は、特殊文字の長さが 1 しかなく、コードの長さが 3 であることです。コードは、特殊文字の後の文字を置き換えてしまいます。これは、置換を行うために使用しているコードです。

char *p = enteredCharStr;
while ((p = strstr(p, specialCharArr[x])) != NULL )
{
    char *substr;
    substr = strstr(enteredCharStr, specialChar[x]);
    strncpy(substr, charCodesArr[x], 3);
    p++;
}

私のプログラムを入力で使用した場合の出力例: "this=this&that"

this%3Dis%26at

出力を次のようにしたいと思います。

this%3Dthis%26that

私がやろうとしていることを C (ライブラリなし) で実装する方法についてのアイデアはありますか?

4

5 に答える 5

6

この問題に対処する 1 つの方法は、文字列の 3 倍の大きさの 2 番目の文字列を割り当て、enteredCharStr文字を 1 つずつコピーし、特殊文字が表示されたら代わりにその文字列を書き込むことです。最悪の場合、ほぼすべての文字を置き換える必要があるため、3 倍の大きさにする必要があります。

于 2013-05-09T02:41:54.007 に答える
1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int isspecial(int c){
    static char table[] = "#%&?=<>"; //add etc..
    return strchr(table, c) ? 1 : 0;
}

char *encode(const char *s){
    size_t capa = 1024;
    char *buff=malloc(capa*sizeof(char));
    size_t size = 0;
    for(;*s;++s){
        if(size + 3 > capa){
            capa += 32;
            buff = realloc(buff, capa*sizeof(char));
        }
        if(isspecial(*s)){
            size+=sprintf(buff+size, "%%%02x", *s);
        } else {
            size+=sprintf(buff+size, "%c", *s);
        }
    }
    if(size == capa){
        buff=realloc(buff, (size+1)*sizeof(char));
    }
    buff[size++]='\0';

    return realloc(buff, size*sizeof(char));
}

int main(void){
    char *enteredCharStr = "this=this&that";
    char *p = encode(enteredCharStr);
    printf("%s\n", p);
    free(p);
    return 0;
}
于 2013-05-09T11:04:03.687 に答える
0

新しい文字列を作成する必要があります。次に例を示します。

char *str = "abc$ddd";
char *p = str;
char *buf = malloc(strlen(str)+1);
char *pbuf = buf;
while(*p) {
  if(*p != '$') *pbuf ++ = *p;
  p++;
}

バイト単位ですべての非バイトにコピーしstrます。buf$

あなたの場合、新しい文字列のサイズを正しく計算する必要があることに注意してください。

于 2013-05-09T02:42:07.353 に答える
0

文字を 1 つずつコピーしています。特殊文字 (このコードでは "#" のみ) が見つかった場合は、3 文字でコピーし、インデックスを出力バッファーに 3 ずつインクリメントします。バッファーサイズを推測し、オーバーランするたびにバッファーのサイズを 2 倍にして、操作全体をループする可能性があります。

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char* argv[]){
    if (argc != 2) {
        exit(1);
    }
    char* input = argv[1];
    int bufferSize = 128;
    char* output = malloc(bufferSize);
    int outIndex = 0;
    int inIndex = 0;

    while(input[inIndex] != '\0'){
        switch (input[inIndex])
        {
            case '#':·
                if(outIndex + 4 > bufferSize){
                    // Overflow, retry or something.
                    exit(2);
                }
                output[outIndex]   = '%';
                output[outIndex+1] = '2';
                output[outIndex+2] = '3';
                outIndex = outIndex + 3;
                inIndex  = inIndex + 1;
                break;
            // Other cases
            default:
                if(outIndex + 2 > bufferSize){
                    exit(2);
                }
                output[outIndex] = input[inIndex];
                outIndex = outIndex + 1;
                inIndex = inIndex + 1;
                break;
        }
    }
    output[outIndex] = '\0';

    printf("%s\n", output);
    return 0;
}
于 2013-05-09T02:55:07.550 に答える
0

AC 'string' は固定サイズの文字配列であるため、組み込みの挿入概念はありません。n配列の途中に文字を挿入する方法を効果的に求めています。

1 つの戦略が思い浮かびます。

lengthの配列のx位置にlength の文字列を挿入するには: in

  • 配列のサイズを変更しますn+x(のようなものを使用realloc)。
  • ipositionを超えてすべての文字を position にシャッフルしi+xます。
  • xこのシャッフル操作によって解放された位置に文字列を書き込みます。

または、ターゲット文字列を保持するのに十分な大きさの新しい配列を割り当て (つまり、すべての置換が適用された状態で)、置換したい文字に遭遇するまでターゲット配列からコピーして結果を書き込みます。次に、置換文字列からコピーしてから、元のソース配列から読み取りを続けます。

于 2013-05-09T02:42:41.700 に答える