C语言报错:expression must be a pointer to a complete object type求助
问题分析与代码修正
错误根源
- 参数传递不匹配:
encrypt函数声明接收char*(单个字符串指针),但调用时传入kalimat[i][j][0]——这是单个字符,类型完全不符,直接触发指针类型错误。正确传参应为kalimat[i][j],它作为char[99]会隐式转换为char*。 - 数组访问逻辑错误:
encrypt函数内把sentence(一维字符串指针)当成三维数组sentence[i][j][k]访问,完全违背变量类型定义,是报错的核心原因。 - 字符串复制非法:
strcpy仅用于单个字符串复制,不能直接将三维数组kalimatBaru赋值给sentence,两者类型不兼容。 - 局部变量生命周期问题:
kalimatBaru是encrypt内部的局部数组,函数执行完毕后会被销毁,无法作为有效数据传递给外部。
修正后的代码
假设需求是对每个单词按固定步长提取字符生成加密结果,调整后的代码如下:
#include <stdio.h> #include <string.h> // 修正encrypt:接收单个字符串,处理后修改原字符串 void encrypt(char *sentence) { int panjang = strlen(sentence); char kalimatBaru[99]; int index = 0; // 按步长提取字符(可根据实际加密规则修改逻辑) for (int k = 0; k < strlen(sentence); k += panjang) { if (k < strlen(sentence)) { kalimatBaru[index++] = sentence[k]; } } kalimatBaru[index] = '\0'; // 将加密结果复制回原字符串 strcpy(sentence, kalimatBaru); } int main() { int jumlahKalimat, jumlahKata, kataTerbanyak = 0; printf("Masukkan jumlah kalimat: "); scanf("%d", &jumlahKalimat); char kalimat[jumlahKalimat][99][99]; for (int i = 0; i < jumlahKalimat; i++) { printf("Masukkan jumlah kata kalimat ke-%d: ", i + 1); scanf("%d", &jumlahKata); if (jumlahKata > kataTerbanyak) { kataTerbanyak = jumlahKata; } for (int j = 0; j < jumlahKata; j++) { scanf("%s", kalimat[i][j]); } } for (int i = 0; i < jumlahKalimat; i++) { printf("Kalimat ke-%d (encrypted): ", i + 1); for (int j = 0; j < kataTerbanyak; j++) { if (kalimat[i][j][0] != '\0') { // 修正传参:传入单个单词的指针 encrypt(kalimat[i][j]); printf("%s ", kalimat[i][j]); } } printf("\n"); } return 0; }
核心修正点
- 重构
encrypt函数逻辑,针对单个字符串处理,用一维临时数组存储加密结果,避免三维数组的误用。 - 修正
encrypt调用传参,传入单个单词的指针kalimat[i][j]。 - 修复字符串复制逻辑,确保
strcpy仅用于合法的字符串间复制。
内容的提问来源于stack exchange,提问作者rayhan rangga yudha
相关产品推荐
相关产品推荐

