問題#1:
関数は、スタックに割り当てられている(一時的な)文字列へのポインタを返します。これは、関数が終了すると、のメモリrtn
が解放され、関数が返すポインタが無効になるchar *
ことを意味します。
あなたがむしろしたいことは:
void getstring(char str[], char rtn[])
{
/* Some processing on rtn... */
}
の呼び出し元getstring
は、として渡された文字列の割り当てと割り当て解除を処理する必要がありますrtn
。
問題#2:
whileループは無期限に実行されます。これは、i
決して増加しないためです。i++
ループ内のどこかに置きます。
問題#3:ステートメント
の状態に問題if
があります。文字列リテラル(最後にある)である、、または、str[i]
と比較します。これは間違っています。
それらを(引用符ではなく)アポストロフィで示される文字と比較する必要があります。
また、テスト条件も間違っていることに注意してください。ORの代わりに論理AND演算子が必要です。-ステートメントを次のように変更します。char
" "
"$"
'\0'
if
if (str[i] != ' ' && str[i] != '$')
問題#4:
どういうrtn[i] = '';
意味ですか?''
は空の文字定数であり、Cでは無効です。
で文字をスキップしたいstr
ですか?
問題#5:
インデックス作成に問題があります。str
とは明らかに長さが異なる可能性があるためrtn
、文字列ごとに1つずつ、2つの実行中のインデックスを管理する必要があります。
問題#6:
rtn
関数が戻ったときに必ずしもnullで終了するわけではありません。関数が戻る前(つまり、-loopが終了した後)'\0'
の終わりに割り当てます。rtn
rtn[i] = '\0';
while
上記のすべての問題が修正されたコードは次のとおりです。
void getstring(char str[], char rtn[])
{
int i = 0, j = 0;
while (i < strlen(str))
{
if (str[i] != ' ' && str[i] != '$')
rtn[j++] = str[i];
i++;
}
rtn[j] = '\0';
}
そして、これはインデックスの代わりにポインタを使用し、使用しないより効率的なバージョンですstrlen
:
void getstring(char *str, char *rtn)
{
while (*str)
{
if (*str != ' ' && *str != '$')
*rtn++ = *str;
*str++;
}
*rtn = '\0';
}