You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数返回值
}

修复说明

  1. 初始化所有未定义变量,避免读取内存随机值。
  2. 修正scanf读取字符串的参数,去掉多余的&。
  3. 调整字符串拷贝方向,使用strncpy避免缓冲区溢出。
  4. 增加除零判断,避免无有效投票时的计算错误。
  5. 修正main函数的返回值类型,符合C语言标准。

内容的提问来源于stack exchange,提问作者Steech Hudson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:50:56