1

gccを使用してマシンで実行し、セグメンテーション違反の出力も得られるかどうかを確認してください。プログラムに問題はないと思います。私はCの初心者です。だから助けて!

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

char *scat(char *,char *);

void main()
{
    char *s="james";
    char *t="bond";

    char *w=scat(s,t);
    printf("the con: %s\n", w);
    free(w);
}

char *scat(char *s,char *t)
{ 
    char *p=malloc(strlen(s)+strlen(t)+1); 
    int temp=0 , ptr=0;

    while(s[temp]!='\0'){
        p[ptr++]=s[temp++];
    } 
    temp=0;
    while(t[temp]='\0'){
        p[ptr++]=t[temp++];
    }
    return p;
}
4

4 に答える 4

1

の文字列を 0 で終了しませんscat。以下を追加できます。

p[ptr] = 0;

帰る直前。

于 2013-01-10T19:41:23.967 に答える
1

2 番目のループは効果がありません。

while(t[temp]='\0') { // <<== Assignment!!!
    p[ptr++]=t[temp++];
}

これは!=not=である必要があります。さらに良いことに、ゼロを完全に削除できます。

while(t[temp]) { // Zero-checking is implicit in C
    p[ptr++] = t[temp++];
}

sorに書き込んでいないのでt、おそらく両方を宣言することをお勧めしますconstwhileこれにより、上記のループで割り当てがキャッチされます。

于 2013-01-10T19:42:42.773 に答える
0
  1. gcc を使用してマシンで実行し、セグメンテーション エラーの出力も表示されるかどうかを確認してください。
  2. プログラムに問題はないと思います。

私はあなたの推論に従いません。システムでプログラムのセグメンテーション違反が発生した場合、プログラムに問題がある可能性が非常に高くなります。

参考までに、これは GCC(*) が出力するものです。コンパイルさえしません。

注: 実際には g++ ですが、あまり大きな違いはありません。

于 2013-01-10T19:46:22.050 に答える
0

string.h に存在する関数をエミュレートする必要はありません。

#include <string.h>

char *scat(char *s,char *t)
{ 
    char *p;
    size_t len1, len2;
    len1 = strlen(s);
    len2 = strlen(t);

    p=malloc(len1+len2+1);
    if (!p) barf();
    memcpy(p,s, len1);
    memcpy(p+len1, t, len2+1);

    return p;
}
于 2013-01-10T19:52:37.160 に答える