1

だから私はここに近いと思いますが、逆の文字列を所定の位置に印刷すると、まだ面白い結果が得られます。私は詳細にしようとします。

入力は次のとおりです。

Writing code in c
is fun

ここに私が欲しいものがあります:

c in code Writing
fun is

実際の出力は次のとおりです。

C
 in code Writing
fun
 is

これが私のコードです:

char str[1000];  /*making array large. I picked 1000 beacuse it'll never be written over.  A line will never hole 1000 characters so fgets won't write into memory where it doesnt belong*/

int reverse(int pos)
{
    int strl = strlen(str)-1,i;
    int substrstart = 0,substrend = 0;
    char temp;

    for(;;)
    {
            if( pos <= strl/2){    /*This will allow the for loop to iterate to the middle of the string. Once the middle is reached you no longer need to swap*/ 
                    temp = str[pos];        /*Classic swap algorithm where you move the value of the first into a temp variable*/
                    str[pos]= str[strl-pos]; /*Move the value of last index into the first*/
                    str[strl-pos] = temp;   /*move the value of the first into the last*/
            }

            else
            break;
    pos++;  /*Increment your position so that you are now swaping the next two indicies inside the last two*/
    }       /* If you just swapped index 5 with 0 now you're swapping index 4 with 1*/


    for(;substrend-1 <= strl;)
    {
    if(str[substrend] == ' ' || str[substrend] == '\0' ) /*in this second part of reverse we take the now completely reversed*/ 
            {
            for(i = 0; i <= ((substrend-1) - substrstart)/2; i++)       /*Once we find a word delimiter we go into the word and apply the same swap algorthim*/
                    {
                    temp = str[substrstart+i];              /*This time we are only swapping the characters in the word so it looks as if the string was reversed in place*/
                    str[substrstart+i] = str[(substrend-1)-i]; 
                    str[(substrend-1)-i] = temp;
                    }
    if(str[substrend] == '\t' || str[substrend] == '\n')
    {
    str[substrend] = ' ';   
     for(i = 0; i <= ((substrend-1) - substrstart)/2; i++)      /*Once we find a word delimiter we go into the word and apply the same swap algorthim*/
                    {
                    temp = str[substrstart+i];              /*This time we are only swapping the characters in the word so it looks as if the string was reversed in place*/
                    str[substrstart+i] = str[(substrend-1)-i]; 
                    str[(substrend-1)-i] = temp;
                    }
    }   
            if(str[substrend] == '\0')
            {
                    break;
            }
            substrstart=substrend+1;
            }
    substrend++;    /*Keep increasing the substrend until we hit a word delimiter*/
    }
printf("%s\n", str);   /*Print the reversed line and then jump down a line*/
   return 0;
}


int main(int argc, char *argv[]) 
{

char *filename;  /*creating a pointer to a filename*/
FILE *file20;   /*creating FIlE pointer to a file to open*/
int n;
int i;

if (argc==1) /*If there is no line parameter*/
{
printf("Please use line parameter!\n");
return(5); /*a return of 5 should mean that now line parameter was given*/
}

if(argc>1){
for(i=1; i < argc; i++)
{
filename = argv[i]; //get first line parameter
file20 = fopen(filename, "r"); //read text file, use rb for binary

    if (file20 == NULL){
    printf("Cannot open empty file!\n");
    }

    while(fgets(str, 1000, file20) != NULL) {
    reverse(0);
    }

fclose(file20);

}
return(0); /*return a value of 0 if all the line parameters were opened reveresed and closed successfully*/ 

}
}

逆関数のロジックのエラーを指摘してくれる人はいますか?

4

2 に答える 2

0

書き込んだ内容は、ファイル全体を1つのバッファーに読み取り、ファイル全体に対して逆関数を一度に実行します。

最初の行を逆にしてから次の行を逆にするなどの場合は、fgetsなどを使用して一度に1行ずつ読み取る必要があります。各行を一度に1つずつ逆方向に実行すると、必要なものが得られるはずです。

http://www.cplusplus.com/reference/cstdio/fgets/

于 2012-12-05T10:06:30.543 に答える
0

ファイル全体を 1 つのバッファーに読み込み続けてから、バッファーで行ごとに逆方向に一度に実行する場合 (1 行を読み込んで逆方向に読み込んで次の行を読み込んで逆方向にするのではなく、など)、reverse() アルゴリズムを書き直す必要があります。

あなたが持っているものはすでに機能しているようです。既存のロジックにいくつかの変更を加えて、既存のロジックに別のループを追加することで、必要なものを取得できると思います。str[] の先頭へのポインタから始めて、それを と呼びましょうchar* cp1 = str。この新しいループの先頭で、別のポインター を作成し、char* cp2それを cp1 に等しく設定します。cp2 を使用して、現在の行の末尾までスキャンし、改行または '\0' を探します。これで、現在の行の先頭 (cp1) へのポインターと、現在の行の末尾 (cp2) へのポインターが得られます。str[] を直接使用する代わりに、これらのポインターを使用するように既存のロジックを変更します。単純に現在の行の長さを計算できますlineLen = cp2 - cp1;(行には終端の '\0' がない可能性があるため、strlen() を使用したくないでしょう)。その後、新しいループの先頭に戻り、次の行に進みます (*cp2 が '\0' を指していない場合)... cp1 = cp2+1 を設定して、次の行に進みます。ライン。

于 2012-12-05T10:19:50.303 に答える