[ad_1]
#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
無効なアドレスにアクセスします
[ad_2]
コメント