2017-03-25 4 views
-1

こんにちは、私はC言語の世界では新しく、コードについては本当に奇妙なことがあります。目的は、始まりと終わりにスペースやタブで文字列をトリミングできる関数を作成することです。私はString libを使用することはできません。C:printfのあるコードと別のコードのコードとの差異

問題は、単にテストのための私のコードでprintf関数であり、それは非常によく仕事をしていることです。しかし、私はそのprintfを削除する場合、関数が正しく動作しません...誰も私を喜ばせることができますか?

#include <stdio.h> 

short trim(short idx,char*str,short dir){ //gives the index to trim 
    while(*(str+idx)==' ' || *(str+idx)=='\t') 
     idx+=dir; 
    return idx; 
} 

short findEnd(char *str){ // find the end of the string 
    int ret=0; 
    while(*(str+ret)!='\0')ret++; 
    return ret-1; 
} 

char *strtrim(char *str){ //The function that trims the string 
    short begin=trim(0,str,1); 
    short end=trim(findEnd(str),str,-1)+1; 
    char ret[end-begin]; 
    for (short i=begin; (i-begin)<sizeof(ret);i++){ 
     ret[i-begin]=*(str+i); 
     printf("%d\n",i);// <--------------------------------this is the printf 
    } 
    char *c=&ret[0]; 
    return c; 
} 

int len(char *str){// return the length of the given string 
    int ret=0; 
    for(int i=0;*(str+i)!='\0';i++){ 
     printf("%d %c\n",i,*(str+i));// another printf for testing porpuses 
     ret=i; 
    } 
    return ret; 
} 


int main(){ 
    char *str="  this is a great test to test your testing skills  "; 
    printf("%d\n",len(strtrim(str))); 
} 

できるだけのprintfは、このような違いがどのように:

ここでは、コードですか? printfを使うと毎回printfを使いますが、printfを使っていないと私はそれを実行していますが、いつも間違っています。

+0

'strtrim'はローカル変数へのポインタを返します。 –

+0

[ローカル変数のメモリはそのスコープの外部にアクセスできますか?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –

+0

退職した忍者はあなたの返信に感謝します。はいstrtrimはポインタを返します(そのミスには申し訳ありません)。しかし、私の質問は、ローカル変数メモリ(私は思う)とは全く関係がありません。私はそれを実行するたびにうまくいっていますが、その単一のprintfがなければすべてが間違っています。 –

答えて

0

strtrimでは、戻りポインタ値に割り当てるにはchar ret[end-begin];を使用します。

これはローカルメモリではなく、適切な寿命を持っている:未定義の動作:あなたがルーチンを終了するとすぐにプログラムの他の部分に使用可能になります。

は「私が挿入したときにそれが動作/削除printf」間違いのこの種の赤い旗でなければなりません。

あなたは好きでそれを修正することができます:あなたの結果の実際に割り当てられコピーを返すようにstrdupを使用して

  • は、あなたがすることはできませんので、日常

によって満たされるように別のパラメータを渡します関数プロトタイプを変更し、関数の内部に割り当てます。 strdupやその他のコピー機能を使用できない場合でも、それを行うことはできます。

そのコードを置き換える:

char ret[end-begin]; 

次によって:その後、

char *ret = malloc(end-begin); 

retの代わりcを返します。

あなたはもうそれを必要としないときに、呼び出し元でfreeにそれを忘れてはいけない、今割り当てられた文字列を持っています。

+0

お返事ありがとうございました。残念ながら、私はパラメータを変更することはできませんし、私は文字列のような別のライブラリを使用することはできません... メモリにデータを保持する他の方法はありますか? –

+0

はい、私の編集を参照してください。 –

+0

ありがとうございましたそれは働きました:D –

関連する問題