-5

私はAnsi Cでこの問題を抱えています

3 以下を考慮して、デコードごとに 20 文字の文字列の配列を受け取る関数を作成します。左から右に読むと、数字はそこから投資する文字数を示します (投資する文字の間に数字を入れることができ、その意味で共通文字と見なされます)。
b. 数字文字は、文字列の最初の文字を反転したものに置き換える必要があります。

例。文字列 aj5pr2*dfkl3abc2qwe1azk は ajd*2rpfklcbawqeazk でなければなりません

表記法とポインター演算を使用する

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

#define TAM 20


char* invertNumerSubstrings(char*);

int main()
{
    char chain[TAM];
    printf("\n Ingrese chain: ");
    gets(chain);
    fflush(stdin);
    char result;
    result=invertNumerSubstrings(chain);
    printf("\n Chain modified: ");
    puts(chain);
    printf("\n");   
    return 0;
}

char* invertNumerSubstrings(char* chain)
{
    int flag =0;
    char *pl= chain;
    char *pe= chain;
    char aux;
    while(*pl=='\0'&& *pe=='\0');
    {
        if(!(*pl=='1')&&(*pe=='9'))
        {
            pl++;
            pe++;
        }
        else
        {

            if(flag ==0)
            {
                pe=*pl;
                flag=1;
                pl--;
            }
            if(*pe<*pl)
            {
                aux=*pl;
                *pl=*pe;
                *pe=aux;
            }
        }
    }
    return *chain;
}

このプログラムにはコンパイル エラーはありませんが、動作しませんでした

4

2 に答える 2

1

コードには多くの問題があります。それらのいくつかを指しています。機能中main()

char result;
result=invertNumerSubstrings(chain);

関数の戻り値の型がinvertNumerSubstringsの型char*と一致しませんresult

while(*pl=='\0'&& *pe=='\0');

;上記のステートメントは論理的に正しくなく、条件が満たされた場合にループが無限に実行される可能性があります。*pl=='\0'&& *pe=='\0'質問の必要に応じて、状態は完全に見えません (間違っている場合は修正してください)。

return *chain; 

invertNumerSubstringsreturn ステートメントは、戻り値の型が と一致しない関数の最後のステートメントですchar*

目的の出力を得るには、これを試すことができます。

void invertNumerSubstrings(char* chain)
{

char *pl= chain;
char* chain_ptr=chain;   // chain_ptr to hold starting address of chain
char* final=(char*)malloc(sizeof(chain));
char* final_ptr=final;  // // final_ptr to hold starting address of final
memset(final, '\0', sizeof(chain));

while(*pl!='\0')
{

    if(*pl>=49 && *pl<=57) //
    {   
         int shift=*pl-48; // to find the shift amount
         int i=0;
         *pl++;

         for(i=shift-1; i>=0; i--){
             *final=*(pl+i);
             final++;
         }
       pl=pl+shift;  // seek the pointer to correct position            
    }

     else
         {
              *final=*pl;
               pl++;
               final++;

         }
}

chain=chain_ptr; // assign original address of chain to chain again

while(*final_ptr !='\0'){
      *chain=*final_ptr ;
      final_ptr++;
      chain++;             
}
*chain='\0';

free(final);

}

仮定: 文字列で整数が検出された場合、後続の文字列の長さは少なくとも整数の値と同じです。

于 2014-10-24T20:29:44.320 に答える
1

これを試してみると、コンパイラの警告が表示されます-main()あなたは宣言しました

char result; result=invertNumerSubstrings(chain);

しかし、その関数は型char*です。しかし、あなたも使用しませんresult

もっと深刻なことに、あなたが入れた関数while(*pl=='\0'&& *pe=='\0');の悪い末尾に注意してください。;このステートメントは、コンテンツがない場合は永久に実行chainされますが、そうでない場合は1回だけ実行され、その後、次のコードブロックが1回だけ実行されます。

于 2014-10-24T20:14:47.533 に答える