0

誰かがこのコードで私を助けてくれますか? これら2つのポインタを一緒に追加する必要がありますが、うまくいきません。コードはポインターを一緒に追加しません。*mystrcat 関数が間違っていると思います。

// stringAdds.cpp : Defines the entry point for the console application.
//

char *mystrcat(char *s, char *p);

int _tmain(int argc, _TCHAR* argv[])
{
    char myChar = 0;
    int i = 0;

    char *s = (char*) malloc (1);
    char *p = (char*) malloc (1);

    printf("Input s: ");
    while ((myChar=getchar()) != '\n')
    s[i++]=myChar;
    s[i]='\0';
    //scanf("%s", &s);
    printf_s("%s", s);

    printf("\nInput p: ");
    i = 0;
    while ((myChar=getchar()) != '\n')
    p[i++]=myChar;
    p[i]='\0';
    printf_s("%s\n", p);

    printf_s("return string: %s", mystrcat(s,p));   
}

char *mystrcat(char *s, char *p)
{
    int sizeOfs = 0;
    int sizeOfp = 0;
    int sizeZero = 0;

    while(*s!='\0')
    {
        sizeOfs++;
    }
    while(*p!='\0')
    {
        sizeOfp++;
    }
    for( int i=0; i<sizeOfp; i++) 
        {
            s[sizeOfs++]=p[sizeZero++];
        }
    s[sizeOfs]='\0';

    return s;
}
4

5 に答える 5

3

これはおそらく宿題なので、いくつかのヒントを次に示します。

中身mystrcat

  • while(*s!='\0')sループの本体内で変更されないため、無限ループです
  • のサイズを知る必要はありません。p
  • その値を返すsことができるように保存します
  • sループを使用して文字列の末尾に移動する
  • pの文字を、sヒットするまで新しいポインターが指すものにコピーします'\0'
  • あなたは終わった

外側mystrcat

  • 関数は、 のすべての文字、 のすべての文字、および null ターミネータを格納するのに十分なスペースmystrcatがあると想定しています。あなたのコードは、null ターミネータだけを保持するのに十分なスペースです。より多くのスペースを提供するには、ロジックを変更する必要があります。sspmalloc
  • あなたがしmallocなければならないすべてfreed.
于 2012-11-01T15:33:51.290 に答える
1

malloc は 1 バイトしかありませんが、潜在的に多くの文字を *s と *p に配置しています。配列に配置する前に、少なくともすべての文字のストレージが必要です。

于 2012-11-01T15:34:36.903 に答える
0

ジェニファー、認めざるを得ませんが、これは前にお話ししたコードと非常によく似ています。

しかし、いくつかの重要な要素が欠けています。

まず、私がイニシャルをしていたときmalloc()

char * str1 = malloc(6); // give string 1 some memory

文字列に入れようとしているものに十分な量があるようにしました(その例では「こんにちは」)。が表示されるまで、文字列を動的に取得しようとしています'\n'。したがって、このアプローチを使用する場合は、「十分に大きな」ものを割り当てる必要があります。

char *s = (char*) malloc (1);

文字列には少なくとも文字のスペースが必要であり、'\0'そうでなければ文字列ではなく単なる文字であるため、これは「十分な大きさ」にすることはできません。:)

「十分な大きさ」が何であるかを実際に判断することはできないため、文字列サイズに上限がない場合は、メモリをいくらか取得して、オーバーフローに近づいたらさらに取得します。

char *s = (char*) malloc (50); //That's better, room for some char's

mystrcat()関数で見逃した 2 番目のポイントは、そこに挿入した行を参照してください。

// We need more memory for s, it was only made to hold its own string so :
s = realloc(s, length of s + length of p + 1);  // +1 for NULL terminator

realloc() で読み取ることができますが、基本的にはより多くのメモリを提供できます。文字列を連結しているときは、おそらくより多くのメモリを取得する必要があります。aそれがとのサイズを数えるポイントでしたp


3番目のポイント、私があなたに与えた疑似コードは次のとおりです。

while(s's character is not '\0')

あなたがしていることはうまくいきません。'\0'文字列内の文字を次のようにチェックする必要があります。

while(s[counter] != '\0')

そして、あなたが行くにつれてカウンターをインクリメントします。

于 2012-11-01T15:58:58.887 に答える
0

正しいコード:

char *ss=s;
while(*ss!='\0')
{
    sizeOfs++; ss++;
}
char *pp=p;
while(*pp!='\0')
{
    sizeOfp++; pp++;
}

基本的に無限ループがありました。また、メモリ オーバーフローが発生しないように、より大きなサイズを malloc します。

于 2012-11-01T15:33:51.820 に答える
0

これだけのことですか?あなたの例には、参照解除が欠けていると思います。

char *strcat (char *dest, const char *src)
{
char *dp;
char *sp = (char *)src;

if ((dest != NULL) && (src != NULL))
{
    dp = &dest[strlen(dest)];

    while (*sp != '\0')
    {
        *dp++ = *sp++;
    }
    *dp = '\0';
}
return dest;
}
于 2012-11-01T15:33:38.277 に答える