【解決方法】セグメンテーション違反 (コアダンプ) を解決するにはどうすればよいですか?


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

// Max number of candidates
#define MAX 9

// Candidates have name and vote count
typedef struct
{
    string name;
    int votes;
}
candidate;

// Array of candidates
candidate candidates[MAX];

// Number of candidates
int candidate_count;

// Function prototypes
bool vote(string name);
void print_winner(void);

int main(int argc, string argv[])
{
    // Check for invalid usage
    if (argc < 2)
    {
        printf("Usage: plurality [candidate ...]\n");
        return 1;
    }

    // Populate array of candidates
    candidate_count = argc - 1;
    if (candidate_count > MAX)
    {
        printf("Maximum number of candidates is %i\n", MAX);
        return 2;
    }
    for (int i = 0; i < candidate_count; i++)
    {
        candidates[i].name = argv[i + 1];
        candidates[i].votes = 0;
    }

    int voter_count = get_int("Number of voters: ");

    // Loop over all voters
    for (int i = 0; i < voter_count; i++)
    {
        string name = get_string("Vote: ");

        // Check for invalid vote
        if (!vote(name))
        {
            printf("Invalid vote.\n");
            i--;
        }
    }

    // Display winner of election
    print_winner();
}

// Update vote totals given a new vote
bool vote(string name)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(name, candidates[i].name) == 0)
        {
            candidates[i].votes++;
            return true;
        }
    }
    return false;
}

// Print the winner (or winners) of the election
void print_winner()
{
    int maxvotes = candidates[0].votes;
    for (int i = 0; 1 < candidate_count; i++)
    {
        if(candidates[i].votes > maxvotes)
        {
            maxvotes = candidates[i].votes;
        }
    }

    for(int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes == maxvotes)
        {
            printf("%s\n",candidates[i].name);
        }
    }
    return;
}

私が試したこと:

初めてのことなので対処法を教えてください

解決策 1

セグメンテーション フォールトは、自分のものではないメモリにアクセスしていることを意味します。通常、これは不正なポインターまたは null ポインターに対するポインター操作の結果ですが、そうでないインデックスを使用しようとすると、配列でそれを取得することもできます。存在しません。

それを修正することはできません。そのコードのどこに問題があるのか​​ わかりません。同じ状況でコードを実行することはできません(たとえば、実行した)、エラー メッセージが表示されません。

推測では、それはおそらく引数リストだったと思います-あなたは本当にあなたが思っている数の引数を渡していますか? しかし、可能なのは推測だけであり、それはマークから何マイルも離れている可能性があります.

だから、それはあなた次第になるでしょう。
幸いなことに、何が起こっているのかを調べるのに役立つツール、デバッガーを利用できます。 使用方法はコンパイラ システムによって異なりますが、IDE と「デバッガ」の名前を Google で検索すると、必要な情報が得られます。

関数の最初の行にブレークポイントを置き、デバッガーでコードを実行します。 次に、コードとデータを見て、何が起こるべきかを手動で解決します。 次に、各行を 1 ステップ実行して、予想どおりの動作を確認します。 そうでない場合は、問題が発生したときであり、後戻りして (またはもう一度実行して詳しく調べて) 原因を突き止めることができます。

申し訳ありませんが、私たちはあなたにそれを行うことはできません – 新しい (そして非常に便利な) スキルを学ぶ時が来ました: デバッグ!

解決策 2

あなたのコードをコンパイルできません。間違ったコード行がいくつかあります。
例えば。:
*ファイル cs50.h は存在しません。
*std::string を使用するには、 を含める必要がありますが、 を含める必要があります。
*main 関数は int main(int argc, char* argv である必要があります[])
*strcmp を使用するには を含める必要があります
*get_int\get_string 未定義

しかし、おそらくクラッシュの原因となったコード ブロックは次のとおりです。

for (int i = 0; 1 < candidate_count; i++)
   {
       if(candidates[i].votes > maxvotes)
       {
           maxvotes = candidates[i].votes;
       }
   }

あなたのコード:

1 < candidate_count

だがしかし

i < candidate_count

無効なアドレスにアクセスします

コメント

タイトルとURLをコピーしました