在firstapp1.exe中的0x6D4DE559(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0x00000000 我在网上查过了,我只能找到C++的线程,而我使用C,所以我来问,抱歉如果重复了。
我还在学习,我在努力理解 我刚刚学习了strcpy和strcmp,但我的大脑根本无法理解为什么下面的代码不起作用在firstapp1.exe中的0x6D4DE559(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0x00000000 我在网上查过了,我只能找到C++的线程,而我使用C,所以我来问,抱歉如果重复了。,c,memory,C,Memory,我还在学习,我在努力理解 我刚刚学习了strcpy和strcmp,但我的大脑根本无法理解为什么下面的代码不起作用 void ifelse(); char nametype[100]; char typeofname[100]; char truth[100]; int main() { char name[100]; int age; printf("\n Print \n"); ifelse(); printf("Enter your name
void ifelse();
char nametype[100];
char typeofname[100];
char truth[100];
int main() {
char name[100];
int age;
printf("\n Print \n");
ifelse();
printf("Enter your name: ");
fgets(name, 100, stdin);
printf("Enter your age: ");
scanf("%d", &age);
if (age > 50) {
strcpy(truth[100], "and you are an old person.");
}
if (age < 50) {
strcpy(truth[100], "and you are relatively young.");
}
else {
strcpy(truth[100], "and you're a middle age person with issues...");
}
printf("Hello, your %s is %s, %s", nametype, name, truth);
return 0;
}
void ifelse() {
printf("Enter your name type (firstname/lastname): ");
fgets(typeofname, 100, stdin);
if (strcmp(typeofname, "firstname") == 0) {
strcpy(nametype[100], "first name");
}
if (strcmp(typeofname, "lastname") == 0) {
strcpy(nametype[100], "last name");
}
}
void ifelse();
字符名称类型[100];
字符类型名称[100];
真相[100];
int main(){
字符名[100];
智力年龄;
printf(“\n Print\n”);
ifelse();
printf(“输入您的姓名:”);
fgets(名称,100,标准DIN);
printf(“输入您的年龄:”);
scanf(“%d”和年龄);
如果(年龄>50岁){
strcpy(真理[100],“你是个老人。”);
}
如果(年龄<50岁){
strcpy(真理[100],“你还相对年轻。”);
}
否则{
strcpy(真理[100],“你是一个有问题的中年人……”);
}
printf(“您好,您的%s是%s,%s”,nametype,name,truth);
返回0;
}
void ifelse(){
printf(“输入您的姓名类型(firstname/lastname):”;
fgets(名称类型,100,标准名称);
if(strcmp(typeofname,“firstname”)==0){
strcpy(名称类型[100],“名字”);
}
if(strcmp(typeofname,“lastname”)==0){
strcpy(名称类型[100],“姓氏”);
}
}
在if和else语句中,我在尝试复制名为“truth”的字符串时出错,我还尝试键入strncpy以防万一,但没有
它应该继续执行底部的print函数,但要么它不会打印变量,要么它会输出一个分配错误,strcpy接受两个指向缓冲区的指针,或者换句话说,数组
truth[100]
不是指向缓冲区的指针,而是数组后面的元素。因此,正确的呼叫应如下所示:
strcpy(truth, "and you are an old person.");
strcpy(nametype, "first name");
对代码中的所有类似调用进行更正 其中是
ifelse()代码>定义的函数?为gcc/clang打开编译器警告-Wall-Wextra-pedantic
,为VS打开编译器警告/W3
,在代码编译干净之前不要接受代码,没有警告。这解决了问题,谢谢。如果您可以再次帮助em,那么当我使用您建议的编辑运行完整代码时,会出现另一个问题:控制台:输入您的姓名类型(firstname/lastname):firstname输入您的姓名:Bruce输入您的年龄:18最终打印:您好,您的名字是Bruce,我记得,fgets
最后用\n
字符填充提供的缓冲区typeofname
。因此,将“firstname”与“firstname”进行比较,并返回非零。是否有任何方法可以取消\n?按Enter键时,将编号推到行中。您的代码应该检查字符串中的最后一个输入字符,并在必要时删除\n
。