我需要编写一个包含带有字母(TAB1)的数组的程序,带有指针(TAB2)的数组(TAB2)和一个存储用户给出的单词的数组(TAB2)。到目前为止,它看起来如此:
#include<stdio.h>
#include<string.h>
#define W 5
#define K 5
#define D 24
int main(){
char tab1[W][K] = {
'a', 'f', 'k', 'p', 'w',
'b', 'g', 'l', 'r', 'x',
'c', 'h', 'm', 's', 'y',
'd', 'i', 'n', 't', 'z',
'e', 'j', 'o', 'u' };
char *tab2[D] = { NULL };
for (int k = 0; k < 5; k++){
for (int l = 0; l < 5; l++){
printf("%c ", tab1[k][l]);
}
printf("n");
}
char tab3[D+1];
printf("nGimme some word.n");
fgets(tab3, 24, stdin);
}
现在,我必须浏览一个给定的单词,检查(在TAB1中)在其中使用的字母在哪里,并将指针放在TAB3中。然后使用这些指针,我应该从TAB1中获取数据并打印单词。
int a = strlen(tab3);
for (int m = 0; m < a; m++){
for (int n = 0; n < 5; n++){
for (int o = 0; o < 5; o++){
if (tab3[m] == tab1[n][o]){
tab2[m] = &tab1[n][o];
}
}
}
}
for (int p = 0; p < (a + 1); p++){
printf("%c", *tab2[p]);
}
它确实编译了,但是当我运行它时,它将进入我给出的单词并按Enter停止并给出此错误的地步:consoleapplication17.exe中的0x00CD409D未经处理的例外:0xc0000005:访问违规行为阅读位置0x00000000。
我不能告诉我在哪里犯错,我会发疯的,请有人可以帮我吗?
错误消息"访问违规读取位置0x00000000"表示您的程序正在尝试在位置0x0读取内存,这将导致例外。当您试图将其删除时,数组TAB2的元素之一是具有零值。解决此问题的正确方法是检查您的算法并确保无法实现此情况(您正在确定未正确设置的指针变量)。处理这些情况的一种安全方法是在取消指针之前进行无效检查。在您的情况下,(可读性)
if(tab2[p] != NULL)
{
printf("%c", *tab2[p]);
}
else
{
printf("This pointer is not yet initialized!");
}
请注意,这不会捕获指针可能会保留的其他无效地址。在您的情况下,它将起作用,因为您将TAB2中的所有指针都初始化为null。另请注意,安全机制不能代替固体算法。