1

このプログラムは、n't の後に続くアルファベットを "not" に変更する必要があります。しないように->しない。しかし、それはいくつかの本当に奇妙な出力を示しています。たとえば、文字列の長さの出力の印刷をスキップすると、ガベージになります。また、出力でスペースが s2ace にどのように変化しているかはわかりません。よくわからない場合は、コードにゴーストがあると思います。

#include<stdio.h>
#include<string.h>
#include<ctype.h>

int func(char **str, int cur_len, int max_len)
{
    if (cur_len <= 3)
        return(cur_len);
    else if(max_len < cur_len)
        return(-1);

    int i,j;
    char new[max_len];
    new[0]='\0';
    char temp[2];

    for (i = 0; i < cur_len; i++)
    {
        if(i > 0 && i < cur_len - 2 && isalpha((*str)[i-1]) && (*str)[i] == 'n' && (*str)[i+1] == '\'' && (*str)[i+2] == 't')
        {
            strcat(new," not");
            i=i+2;
        }
            else
        {
            temp[0]=(*str)[i];
            temp[1]='\0';
            strcat(new, temp);
        }
    }
    j = strlen(new);
    if (j > max_len)
        return(-1);

    *str = new;
    return(j);

}


int main()
{
    char *x = "Please don't do anything stupid. all the n't followed by an alphabate should be changed to not followed by a space. e.g. doesn't.";
    int len, max, result;
    len = strlen(x);
    printf("String size = %d\n",len);//**if i comment this line all output goes down the drain.**
    max = 200;

    result = func (&x, len, max);
    if(result == -1)
    {
        printf("No change possible\n");
        return(-1);
    }
    printf("No of changes = %d\n",strlen(x)-len);
    printf("New String is :: %s\n",x);//**how does space change into s2ace??**
    return(0);
}

出力は

129No of changes = 2 New String is :: バカなことしないでください。n't の後にアルファベットが続くものはすべて、s2ace が後に続かないように変更する必要があります。たとえば、しません。

4

1 に答える 1

0

に置き換えchar new[max_len];て、最小限のコード変更で問題を修正します。

char *new = *str = (char*)malloc(max_len+1);

上部にも追加する必要があります#include <stdlib.h>

コメントで述べたように、ローカル オブジェクト (自動ストレージ クラスを使用) へのポインターは、関数が戻るとすぐに無効になります。

静的オブジェクトが消えることはありませんが、可変長配列を静的にできるとは思えません。だから、あなたはmalloc/callocで立ち往生しています。

呼び出し元の関数の作成者が、メモリが不要になったときにポインターを解放することを認識できるように、この動作を必ず文書化してください。(自分が作成者であり、既にそれを知っていると口論する場合は、コードの読者が何が起こっているかを知るのに役立つことを指摘します。)

于 2013-09-22T21:43:52.580 に答える