以下の関数は、最初の2番目の文字列のすべての大文字に変更する必要があります。 最初の文字と一致する場合は、最初の文字列の位置にpを指定してから、一致文字列の残りの部分を確認する必要があります。一致した場合は、すべての文字を大文字に置き換えます。 pポイントの値にアクセスしようとすると「セグメンテーションフォールト」が発生する このプログラムには多くの問題があることがわかります。最初の文字の位置をiに格納し、i + jをインデックスとして使用できます最初の文字列の場合。また、2番目の文字列に文字のみが含まれているかどうかを確認しません。 とにかく、より良いバージョンを書き直すことができたとしても、この特定のケースでポインタの使用に何が問題なのかを本当に知りたいです。Cのセグメンテーション・フォルト、理由を特定できない
char *matchToUp(char *s, char *match)
{
int i = 0, j=0;
char *p = s;
while (s[i] != '\0')
{
while(s[i]!= match[0] && s[i]!= '\0')
{
i++;
}
printf("%d", i);
p = &s[i];
while (match[j] != '\0' &&p[j] == match[j])
{
j++;
}
if(match[j] == '\0')
{
printf("%d", j);
while(j >= 0)
{
p[j] = (char) toupper((unsigned int) p[j]);
j--;
i++;
}
}
else
{
j=0;
i++;
}
}
return s;
}
問題の原因は呼び出し元にあります(この関数でも、渡されたデータの健全性チェックではありません)。 –
valgrindおよび/またはgdbで実行し、取得した内容を確認します。 –
char * p; p = matchToUp( "abcde"、 "abc"); データを正当にチェックする必要がありますが、確かに "de"を追加しました。問題はアドレスが範囲外であるという事実ではありません。 私はCode :: Blocksを使用します。イデア? – MatSiv97