C语言实现Logic Gates问题:多字符输出名称打印失败求助
问题解决:多字符输出名称无法正确打印的问题
核心问题原因
- 数组定义错误:你把
output_name、input_name_1、input_name_2定义为char [m][1],第二维度长度为1仅能存储单个字符(连字符串结束符\0都没有空间存放),无法容纳多字符名称。 - 打印索引逻辑错误:
printf("%c ",output_name[0][i]);完全搞反了二维数组的索引关系,output_name[i]才是第i个输出对应的完整名称字符串,而非output_name[0][i]。
修正步骤
- 调整数组维度:将输出和输入名称的数组第二维度改为足够容纳名称的长度(比如和
input_name一致设为9,题目中名称长度不会超过8字符,额外1位存结束符):char output_name[m][9]; char input_name_1[m][9]; char input_name_2[m][9]; - 修正打印语句:将字符打印改为字符串打印,直接输出完整名称:
printf("%s ", output_name[i]); - 修复信号长度判断:
sizeof(input_signal[i])会返回数组总字节数26,实际应使用strlen(input_signal[0])获取信号的真实长度(题目中所有输入信号长度一致):int signal_len = strlen(input_signal[0]); for (int j=0; j<signal_len; j++) - 修复输入值匹配逻辑:原代码硬编码取
input_signal[0]和input_signal[1],应根据input_name_1和input_name_2动态查找对应的信号索引,避免输入数量变化时出错。
修正后的完整代码
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdbool.h> // 根据输入名称查找对应的信号索引 int find_input_index(char name[9], char input_name[][9], int n) { for (int k=0; k<n; k++) { if (strcmp(name, input_name[k]) == 0) { return k; } } return -1; // 题目保证输入合法,不会触发此返回值 } int main() { int n; scanf("%d", &n); int m; scanf("%d", &m); char input_name[n][9]; char input_signal[n][26]; // 修正数组维度,支持多字符名称 char output_name[m][9]; char type[m][5]; char input_name_1[m][9]; char input_name_2[m][9]; int input_value_store_1; int input_value_store_2; for (int i = 0; i < n; i++) { scanf("%s%s", input_name[i], input_signal[i]); } for (int i = 0; i < m; i++) { scanf("%s%s%s%s", output_name[i], type[i], input_name_1[i], input_name_2[i]); } // 获取信号的实际长度 int signal_len = strlen(input_signal[0]); for (int i=0; i < m; i++) { // 修正打印语句,输出完整名称 printf("%s ", output_name[i]); // 找到当前逻辑门对应的两个输入信号索引 int idx1 = find_input_index(input_name_1[i], input_name, n); int idx2 = find_input_index(input_name_2[i], input_name, n); for (int j=0; j<signal_len; j++) { input_value_store_1 = (input_signal[idx1][j] == '-') ? 1 : 0; input_value_store_2 = (input_signal[idx2][j] == '-') ? 1 : 0; if (strcmp(type[i], "AND") == 0) { printf("%c", (input_value_store_1 && input_value_store_2) ? '-' : '_'); } else if (strcmp(type[i], "OR") == 0) { printf("%c", (input_value_store_1 || input_value_store_2) ? '-' : '_'); } else if (strcmp(type[i], "XOR") == 0) { printf("%c", (input_value_store_1 != input_value_store_2) ? '-' : '_'); } else if (strcmp(type[i], "NAND") == 0) { printf("%c", !(input_value_store_1 && input_value_store_2) ? '-' : '_'); } else if (strcmp(type[i], "NOR") == 0) { printf("%c", !(input_value_store_1 || input_value_store_2) ? '-' : '_'); } else if (strcmp(type[i], "NXOR") == 0) { printf("%c", (input_value_store_1 == input_value_store_2) ? '-' : '_'); } } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Blu e's
相关产品推荐
相关产品推荐

