0

文字列から余分なスペースを削除するプログラムを作成しました。

void removeDuplicateSpaces(char **c){  //a-b---c
    char *a=*c;
    char *b=malloc(sizeof(char)*strlen(*c));  <-- allocation
    int i=0,nf=0,space=0;
    for(;a[i]!='\0';i++){
        if(a[i] != ' '){             //a-b-
            if(space>1){
                b[nf]=a[i];
                nf++;
                space=0;
            }else{
                b[nf]=a[i];
                nf++;
            }
        }else{
            space++;
            if(space==1 && i!=0){
                b[nf]=' ';
                nf++;
            }
        }
    }
    b[i]='\0';
    *c=b;
    }

int main(void) {
    char *a="    Arista    is     hiring    from   ISM   Dhanbad";
    removeDuplicateSpaces(&a); //function prototype can't be changed.
    printf("%s",a);     // ? where to deallocate.
    return 0;
}

ワーキングデモ

正常に動作しています。removeDuplicateSpaces()しかし、問題は、関数に割り当てられたメモリをどこで解放する必要があるかです。printfinの後に free ステートメントを追加mainすると、プログラムがクラッシュします ( signal 6 abort)。では、正しい方法は何ですか?


元の問題

#include<stdio.h>
main()
{
    char *foo = "    Arista    is     hiring    from   ISM   Dhanbad";
    void removeDuplicateSpaces(foo);
    printf("%s\n", foo);
}

上記のコードが与えられました。removeDuplicateSpaces指定された文字列の余分なスペースを削除する関数を作成します。

例:(「-」は明確にするためにスペースを示します)

Input String : (without quotes)
“—-Arista——is—-hiring—-from-ISM–Dhanbad”
Output String :
“Arista-is-hiring-from-ISM-Dhanbad”
4

3 に答える 3

1

ここにそれを行う別の方法があります

char* removeDuplicateSpaces( char const * src )  // show that input string is read-only
{
  char* strnospaces = calloc( 1, strlen(src)+1 );// string is filled with \0's
  for (char *t = strnospaces, *s = src; *s; )    // copy until \0
    if (!isspace(*s)) *t++=*s++; else s++;       // copy only if not space
  return strnospaces;  
}
于 2013-10-20T20:44:46.807 に答える
1

removeDuplicateSpaces 関数から割り当てられた文字列を返さないほうがよいでしょう。代わりに、既に割り当てられているバッファーで動作するように変更すると、割り当てたメモリをいつ解放できるかが正確にわかります。

このようなもの:

char *a="    Arista    is     hiring    from   ISM   Dhanbad";
char *b = (char *)malloc(sizeof(a)); // for sure result string will be less or equal to origin
removeDuplicateSpaces(&a, b);
printf("%s",b);
free(b);

そのremoveDuplicateSpaces場合、何も割り当てる必要はありません。

編集: これを試してください

void removeDuplicateSpaces(const char **c){  //a-b---c
    char *a=*c;
    int i=0,nf=0,space=0;
    for(;a[i]!='\0';i++){
        if(a[i] != ' '){             //a-b-
            if(space>1){
                a[nf]=a[i];
                nf++;
                space=0;
            }else{
                a[nf]=a[i];
                nf++;
            }
        }else{
            space++;
            if(space==1 && i!=0){
                a[nf]=' ';
                nf++;
            }
        }
    }
    a[nf]='\0';
}

int main()
{
    char *a="    Arista    is     hiring    from   ISM   Dhanbad";
    char *b = (char *)malloc(strlen(a)+1);
    strcpy(b, a);
    removeDuplicateSpaces(&b); //function prototype can't be changed.
    printf("%s",b);
    free(b);
    return 0;
}
于 2013-10-20T20:18:17.593 に答える
0

次の解決策を提案します。char*が指す割り当てられたメモリを返す関数の戻り値の型を にしますb。次に、次の更新されたコードに示すように、関数の呼び出しを変更します。その後free、メモリを使用できます。main()printf

#include<stdio.h>

char *removeDuplicateSpaces(const char **c){  //a-b---c
    char *a=*c;
    char *b=malloc(sizeof(a));  <-- allocation
    int i=0,nf=0,space=0;
    for(;a[i]!='\0';i++){
        if(a[i] != ' '){             //a-b-
            if(space>1){
                b[nf]=a[i];
                nf++;
                space=0;
            }else{
                b[nf]=a[i];
                nf++;
            }
        }else{
            space++;
            if(space==1 && i!=0){
                b[nf]=' ';
                nf++;
            }
        }
    }
    b[i]='\0';
    *c=b;
    return b;
    }

int main(void) {
    char *a="    Arista    is     hiring    from   ISM   Dhanbad";
    char *c;
    c=removeDuplicateSpaces(&a);
    printf("%s",a);     // ? where to deallocate.a
    free(c);
    return 0;
}
于 2013-10-20T20:15:54.357 に答える