1

私はこのプログラムに何時間も費やし、自分の方法に代わるものをオンラインで検索するために数時間を費やし、一晩中クラッシュやエラーに悩まされてきました…

このコードで達成したいことがいくつかあります。最初に問題を説明し、次にコードを投稿し、最後にプログラムの必要性を説明します。

プログラムは1つの単語だけを出力し、連結関数は何もしません。これは修正するのに十分簡単なはずです...

私の最初の問題は、連結関数が機能していないように見えることです。機能しなかった汎用strcat関数を使用し、インターネットで見つけた別のバージョンも使用しませんでした(この関数はここで使用され、「mystrcat」と呼ばれます) )。プログラムに文字列を読み取らせ、「区切り文字」を削除して、元の文字列内のすべての単語で構成される単一の文字列を作成したいと思います。strtokとstrcat関数を使用しようとしています。より簡単な方法がある場合は、私はすべての耳です。

別の問題。これは必ずしも問題ではありませんが、醜い混乱です。メインに続く7行です。次のように変数を初期化したいと思います。charvariable[amt]; しかし、strtokで見つけたコードはポインターを使用しており、strcat関数のコードはポインターを使用していました。文字列のポインタとアドレスをよりよく理解することは、おそらく長期的に役立つでしょう。しかし、私はそれらの行のいくつかを必要な手段で取り除きたいと思います。2つの変数だけに6行を割り当てることはできません。10個の変数がある場合、30行を上に並べたくありません…</ p>

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

char *mystrcat(char *output, char *firstptr);

int main() {

char str[] = "now # is the time for all # good men to come to the # aid of their     country";
char delims[] = "# ";
char resultOrig[70];    //was [20];
char firstOrig[20];
//char *result = NULL, *first = NULL;
char result = resultOrig;    //was result = &resultOrig;
char first = firstOrig;    //was   first = &firstOrig;

first = strtok( str, delims );

while( first != NULL ) {
    mystrcat(resultOrig, firstOrig);
    printf( "%s ", first );
    printf("\n %s  this should be the concat\'d string so far\n", resultOrig);
    first = strtok( NULL, delims );

}
system("pause");
return 0;
}

char *mystrcat(char *resultptr, char *firstptr)
{
char *output = resultptr;

while (*output != '\0')
    output++;
while(*firstptr != '\0')
{
    *output = *firstptr;
    output++;
    firstptr++;
}
*output = '\0';

return output;
}

これは今のところ単なるテストプログラムですが、ファイルのリスト/データベースにこれを使用するつもりでした。私のファイルには、アンダースコア、ハイフン、ピリオド、括弧、および数字が含まれています。これらすべてを「区切り文字」として設定したいと思います。区切り文字を削除して(ループごとに_から–への変更など)、単一の文字列を作成するループを通過することを計画していました。区切り文字をスペースまたはピリオドに置き換えたい場合があります。また、一部のファイルには、「区切り」したい特殊文字とともにすでにスペースが含まれています。

私はテキストファイルをスキャンすることによってこれをすべて行うことを計画しています。ファイル内には、「2,518,6452」という形式のサイズもあります。データベースをアルファベット順またはサイズ、昇順または降順で並べ替えることができることを望んでいます。これは、上記の私の特定の質問について知っておくと役立つかもしれないいくつかの追加情報です。

以下に、これらの名前がどのように表示されるかについての架空のサンプルをいくつか含めました。my_file(2009).ext second.File-group1.extls the.third.file-vol30.lmth

私はこの投稿に焦点を当てています:連結関数を機能させる方法、またはstrcatやstrtokの代替方法に関する質問。不要なコードや冗長なコードを整理するための支援を求めるだけでなく。

すべての助けと私の投稿を読んでくれたすべての人に感謝します。

どうもありがとう!

4

3 に答える 3

3

strcatループfirstの代わりに使用すると機能します。firstOrigの必要はありませんmystrcat。次のように簡略化できます。

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

int main() {
    char str[] = "now # is the time for all # good men to come to the # aid of their     country";
    char delims[] = "# ";
    char result[100] = "";  /* Original size was too small */
    char* token;
    token = strtok(str, delims);
    while(token != NULL) {
        printf("token = '%s'\n", token);
        strcat(result, token);
        token = strtok(NULL, delims);
    }
    printf("%s\n", result);
    return 0;
}

出力:

token = 'now'
token = 'is'
token = 'the'
token = 'time'
token = 'for'
token = 'all'
token = 'good'
token = 'men'
token = 'to'
token = 'come'
token = 'to'
token = 'the'
token = 'aid'
token = 'of'
token = 'their'
token = 'country'
nowisthetimeforallgoodmentocometotheaidoftheircountry
于 2012-04-19T12:33:09.150 に答える
0

次の2つの文字列を初期化していません。

char resultOrig[20];
char firstOrig[20];

そして、あなたはそれらに文字を追加しています。それらを次のように変更します。

char resultOrig[20] = "";
char firstOrig[20] = "";

また、文字配列の名前はその開始アドレスを示します。それで

result = &resultOrig;
first = &firstOrig;

する必要があります:

result = resultOrig;
first = firstOrig;

変化する

mystrcat(resultOrig, firstOrig);

mystrcat(resultOrig, first);

またresultOrig、次のように、連結を保持するのに十分な大きさにします。

char resultOrig[100] = "";
于 2012-04-19T11:54:52.747 に答える
0

ここにはいくつかの問題があります。

  1. resultOrigとの初期化がありません( codaddictfirstOrigが指摘したように)。

  2. first = &firstOrigあなたがそれから望むことをしません。のどこかを指すようにfirst = strtok(str, delims)設定します。にデータを読み込みません。firststrfirstOrig

  3. 小さなバッファ (わずか 20 バイト) を割り当てて、これよりも多くのバッファを埋めようとします。スタックをオーバーフローさせます。厄介なバグを引き起こします。

于 2012-04-19T12:35:32.533 に答える