我是C语言的新手,当我试图在NetBeans上构建这个应用程序时,显然在编译这个函数时没有错误。但是,当用户输入其姓名和性别时,应用程序通常会输入IF
、ELSE IF
和ELSE
,但在IF
和ELSE IF
中,用户名不会出现在printf((方法中。
#include <stdio.h>
#include <stdlib.h>
ex19(){
char name[100];
char genre;
printf("Enter your name: ");
scanf("%s", &name);
printf("Enter your genre: ");
scanf("%s", &genre);
if (genre == 'M'){
printf("%s you are a BOY", name);
}
else if (genre == 'F'){
printf("%s is GIRL", name);
}
else {
printf("INVALID GENRE");
}
}
main(){
ex19();
}
这个算法会有什么问题?对不起,我是C编程的新手,我冒着不看书或视频课就学习这种语言的风险。目前,我做得很好,因为我以前知道用Java、JavaScript、PHP编程,现在又知道用C语言编程。但这段代码到底发生了什么?
您已经将name
定义为一个字符数组。数组类型的变量扮演的角色与指针非常相似。在name
的scanf
语句中,使用&name
,它是指向该数组的指针。这让它走得太远了;删除&。
这个算法会有什么问题?
算法很好。。。。这个问题似乎源于的高潮
-
其中变量存储在内存中
和
-
将变量
genre
声明为char
(指定保存一个字节大小的单个字符(,并随后尝试将数据读取为字符串,scanf("%s", &genre);
解释:
当执行代码时,genre
的地址在阵列char name[100];
的地址之前一个字节
输入名称后,名称将按预期放置在字符数组name
中。类型的后续scanf
将输入存储在类型的位置,但因为%s
格式说明符还添加了终止NULL(' ')
字符。此"NULL"字符将覆盖name
中的第一个字符。现在name
的第一个字符就是' '
字符。
解决方案:
修改scanf
以读取单个字符scanf(" %c",&genre);
(需要%c
之前的空间来消耗newline
字符(。
或
将genre
的声明更改为char genre[2];
,以包括M
或F
、newline
字符和' '
。
希望这能帮助。。。。。。
void ex19(){
char name[100];
char genre;
printf("Enter your name: ");
scanf("%s", name);
printf("Enter your genre: ");
scanf(" %c", &genre);//ignore whitespace characters and read a character
if (genre == 'M'){
printf("%s you are a BOY", name);
}
else if (genre == 'F'){
printf("%s is GIRL", name);
}
else {
printf("INVALID GENRE");
}
}
或
void ex19(){
char name[100];
char genre[2];//declare genre as a character array
printf("Enter your name: ");
scanf("%s", name);
printf("Enter your genre: ");
scanf("%s", &genre);
if (*genre == 'M'){//deference genre...same as genre[0]
printf("%s you are a BOY", name);
}
else if (*genre == 'F'){//deference genre...same as genre[0]
printf("%s is GIRL", name);
}
else {
printf("INVALID GENRE");
}
}