我刚刚开始学习C并正在完成一些基本练习。我正在编写一个小程序,询问用户的名字,将字符添加到数组中,然后在屏幕上打印数组。如果用户没有输入任何内容(回车),程序应该打印一条消息并退出。它主要起作用,只是当用户按下回车时没有任何反应;
#include <stdlib.h>
#include <stdio.h>
char memberTest[10];
int i;
int main()
{
// ASK QUESTION TO BE ANSWERED
printf("Enter a family member's name (or Press Enter to finish/exit): ");
//TAKE ENTERED STRING AND INSERT IT INTO FAMILY ARRAY
scanf("%s", memberTest);
//IF MEMBERTEST HAS NOTHING IN IT, CLOSE THE PROGRAM
if(memberTest[0] == '\n')
{
printf("You have entered nothing. Goodbye.\n");
exit(0);
}
//PRINT OUT THE CONTENTS OF THE MEMBERTEST ARRAY
printf("%s\n", memberTest);
exit(0);
}
所以,if语句中的逻辑是如果memberTest数组中的第一个元素是回车符('\ n'),它应该打印消息并退出(这是在Linux上,否则我明白了我相信'\ r'中的Windows回车。我仍然试图理解指针的正确应用,所以我不确定这是否与此问题有关。任何帮助表示赞赏。
答案 0 :(得分:4)
'\n'
使用scanf
不会扫描fgets
#include <stdlib.h>
#include <stdio.h>
char memberTest[10];
int i;
int main()
{
// ASK QUESTION TO BE ANSWERED
printf("Enter a family member's name (or Press Enter to finish/exit): ");
//TAKE ENTERED STRING AND INSERT IT INTO FAMILY ARRAY
fgets(memberTest, sizeof memberTest, stdin);
//IF MEMBERTEST HAS NOTHING IN IT, CLOSE THE PROGRAM
if(memberTest[0] == '\n')
{
printf("You have entered nothing. Goodbye.\n");
exit(0);
}
//PRINT OUT THE CONTENTS OF THE MEMBERTEST ARRAY
printf("%s\n", memberTest);
exit(0);
}
这样可以防止溢出memberTest
并读取'\n'
字符。
答案 1 :(得分:2)
%s
转换说明符告诉scanf
跳过任何前导空格(包括换行符)并读取下一个非空白字符序列;它会阻塞,直到有非空白字符要读(或遇到EOF)。
您需要使用fgets
。它会将换行符存储到缓冲区(如果缓冲区中还有剩余空间):
if ( fgets( membertest, sizeof membertest, stdin )
{
if ( membertest[0] == '\n' )
{
// exit
}
// process membertest
}
对于10个字符的缓冲区,fgets
将读取并存储最多9个字符,并在最后一个字符后写入0终止符。如果键入12个字符,则不会从输入流中读取最后3个加上换行符。您需要确保您的缓冲区足够大,以存储您最大的预期字符串加上换行符加上0终结符(或进入动态内存管理,但您可能还不想这样做)。