C语言简易选举程序输出异常问题求助
C语言简易选举程序输出异常问题修复
问题描述
编写的简易选举C语言代码存在输出异常:测试时候选人名称显示随机乱码(如≡kWΩ@☻),部分得票率数值异常,期望输出与char型nama数组中存储的候选人名称一致。
原代码
#include <stdio.h> #include <string.h> void main() { //variabel int k; //-> nilai berdasarkan input admin <line 10> printf(" PEMILU DIGITAL"); printf("\n---------------------------------------------------------------------------------------\n"); printf("presented by Magniv_Enterprise\n\n"); printf("Admin Input jumlah kadidat : "); scanf(" %i", &k); printf("\nMasukkan nama Paslon : "); char nama[k][200]; for (int j; j < k; j++) { printf("\npaslon %i : ", j + 1); scanf(" %s", &nama[j]); } printf("\nJika pemungutan suara sudah selesai, inputkan nilai '-1' untuk mendapatkan hasil pemilu\n"); //perimeters and variabel 2 int kadidat[k]; int loop = 1; int x = 0; // utk user ke berapa pada input int i = 0; // utk hitung jumlah pemberi suara dtung dengan 00 ato tidak int D; // utk menyimpan data nomer paslon yang diinputkan user int max; char maks[50]; int draw; // start looping pemilihan suara while (loop == 1) { printf(" User- %i Memilih paslon :", x + 1); scanf(" %i", &D); x += 1; if (D == -1) { break; } else if (D > k || D <= 0) { printf(" Maaf, nomor yang Anda masukan salah! Silahkan mengulang lagi\n"); x -= 1; } else { kadidat[D - 1] += 1; i += 1; } }//end loop printf("\n----------------------------------------------------------------------------------------"); //Bagian Perhitungan pemenang printf("\nHASIL PEMILU : \n"); int percent; //for (int h = 0; h < k; h++) { // printf("paslon %s punya : %i suara\n",nama[h] ,kadidat[h]); //} for (int L = 0; L < k; L++) { percent = kadidat[L] * 100 / i; if (percent > max) { max = percent; strcpy(nama[L], maks); } printf("Paslon %s : %d persen \n", nama[L], percent); } printf("\nPEMENANG PEMILU Dengan Suara terbanyak adalah : \n"); printf("%s dengan %d persen suara", maks, max); }//end main
测试输出
Admin Input jumlah kadidat : ... -> 基于用户输入 Masukkan nama Paslon : paslon ... : .... -> 基于用户输入 user choose : .... -> 用户输入 ---------------------------------------------------------------------------------------- HASIL PEMILU : -> 过往代码测试结果 Paslon ≡kWΩ@☻ : 15 persen Paslon ≡kWΩ@☻ : 32 persen Paslon ashley : -46215268 persen Paslon ≡kWΩ@☻ : 1460 persen PEMENANG PEMILU Dengan Suara terbanyak adalah : ≡kWΩ@☻ dengan 1460 persen suara
问题根源
- 未初始化变量:
kadidat数组、max、maks、循环变量j均未初始化,直接使用会读取内存随机值,导致得票率异常、乱码。 - 字符串拷贝方向错误:
strcpy(nama[L], maks)将未初始化的maks内容覆盖候选人名称,逻辑完全颠倒。 scanf参数错误:&nama[j]多了取地址符,nama[j]本身已是字符串首地址,错误传递会破坏内存。- 无除零保护:若没有有效投票,
i为0会导致得票率计算时除零错误。
修复后的代码
#include <stdio.h> #include <string.h> int main() { // 符合C标准的main函数返回值类型 int k; printf(" PEMILU DIGITAL"); printf("\n---------------------------------------------------------------------------------------\n"); printf("presented by Magniv_Enterprise\n\n"); printf("Admin Input jumlah kadidat : "); scanf(" %i", &k); printf("\nMasukkan nama Paslon : "); char nama[k][200]; // 初始化循环变量j for (int j = 0; j < k; j++) { printf("\npaslon %i : ", j + 1); // 去掉多余的&,直接传字符串首地址 scanf(" %s", nama[j]); } printf("\nJika pemungutan suara sudah selesai, inputkan nilai '-1' untuk mendapatkan hasil pemilu\n"); int kadidat[k]; // 初始化得票数组为0 memset(kadidat, 0, sizeof(kadidat)); int loop = 1; int x = 0; int i = 0; int D; // 初始化max为0,确保首次比较有效 int max = 0; char maks[50]; // 初始化maks为空字符串 maks[0] = '\0'; int draw; while (loop == 1) { printf(" User- %i Memilih paslon :", x + 1); scanf(" %i", &D); x += 1; if (D == -1) { break; } else if (D > k || D <= 0) { printf(" Maaf, nomor yang Anda masukan salah! Silahkan mengulang lagi\n"); x -= 1; } else { kadidat[D - 1] += 1; i += 1; } } printf("\n----------------------------------------------------------------------------------------"); printf("\nHASIL PEMILU : \n"); int percent; for (int L = 0; L < k; L++) { // 处理无有效投票的除零情况 percent = i == 0 ? 0 : kadidat[L] * 100 / i; if (percent > max) { max = percent; // 正确拷贝方向:将候选人名称复制到maks,用strncpy避免缓冲区溢出 strncpy(maks, nama[L], sizeof(maks)-1); maks[sizeof(maks)-1] = '\0'; } printf("Paslon %s : %d persen \n", nama[L], percent); } printf("\nPEMENANG PEMILU Dengan Suara terbanyak adalah : \n"); printf("%s dengan %d persen suara", maks, max); return 0; // 标准main函数返回值 }
修复说明
- 初始化所有未定义变量,避免读取内存随机值。
- 修正
scanf读取字符串的参数,去掉多余的&。 - 调整字符串拷贝方向,使用
strncpy避免缓冲区溢出。 - 增加除零判断,避免无有效投票时的计算错误。
- 修正
main函数的返回值类型,符合C语言标准。
内容的提问来源于stack exchange,提问作者Steech Hudson
相关产品推荐
相关产品推荐

