我是 C 编程新手,现在正在做 C 课程中的第一份作业。 我注意到在代码中使用字符串时存在异常行为。
我目前正在编写一个简单的字符串编码器,我们的任务是使用一个指向长度为5的字符数组的指针,初始化为空字符串。我们还应该使用 fgets 从用户那里获取一个字符串。
我问了一些人和chatgpt为什么我的代码中会发生这种情况,但还没有找到解决方案。
我确信我的C有很多问题,但现在我真的很想知道是什么导致了这种行为(打印输入字符串的两行,除以通常的printf,在打印字符串的第二行是丢失的)。 您可以在代码下方的屏幕截图中看到终端输出(当前字符串 2:*)
char* get_string(){
char str[100];
puts("Please enter a string");
return fgets(str,sizeof(str),stdin);
}
int main(int argc,char **argv){
struct fun_desc {
char *name;
char (*fun)(char);
};
char (*nullFunction)(char) = NULL;
struct fun_desc menu[] = {
{"Get String", my_get},
{"Print Decimal", dprt},
{"Print Hex", xprt},
{"Print Character",cprt},
{"Encrypt",encrypt},
{"Decrypt",decrypt},
{NULL,nullFunction}
};
int flag = 1;
int i,opNum;
char functions[5] = "";
char *carray = functions;
while(flag){
printf("Current string 1: %s",carray);
printf("Select operation from the following menu:\n");
printf("Current string 2: %s",carray);
puts("\n");
i = 0;
while(menu[i].fun != NULL){
printf("%d) %s\n",i,menu[i].name);
i++;
}
printf("Choose a function by entering it's number\n");
char op[4];
if(fgets(op,sizeof(op),stdin) == NULL)
flag = 0;
else{
opNum = atoi(op);
if(opNum >= 0 && opNum < 6){
puts("Within bounds");
if(opNum == 0)
carray = get_string();
else
carray = map(carray, 5, menu[opNum].fun);
}
else {
puts("Not within bounds");
break;
}
}
}
puts("\nEnd of input\n");
return 0;
}
函数
get_string
返回一个指向具有自动存储功能的数组的指针,当函数返回时超出范围后不得访问该数组。
程序有未定义的行为。