int main(int argc, char** argv)
{
//Local Declaration
char last_name[20];
char first_name[20];
char phone_number[20];
char address[30];
//Statement
printf("Enter your last name: ");
fgets(last_name, 20, stdin);
printf("Enter your first name: ");
fgets(first_name, 20, stdin);
printf("Enter your phone number: ");
fgets(phone_number, 20, stdin);
printf("Enter your address: ");
fgets(address, 30, stdin);
printf("=====Address book=====\n");
printf("Name: %s%s\n", first_name, last_name);
printf("Phone Number: %s\n", phone_number);
printf("Address: %s\n", address);
return (EXIT_SUCCESS);
}
结果并没有像我预期的那样出现......我的意思是名字和姓氏在一行中(例如Mark Zuckerberg)。但它就像这样出现了
标记
扎克伯格
这里有什么问题?为什么中间会有新的一行?
答案 0 :(得分:4)
参见手册页
引用:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后。
因此fgets读取的字符串包含末尾的新行字符。您需要将其删除。
修改强>
要删除行尾(并允许DOS),请执行
int end = strlen(first_name) - 1;
if (end >= 0 && '\n' == first_name[end])
{
first_name[end--] = 0;
if (end >= 0 && '\r' == first_name[end]) first_name[end] = 0;
}
答案 1 :(得分:1)
根据Ed的建议,请参阅手册,将'\n'
替换为' '
(简单空格)的简单方法可能是:
first_name[strlen(first_name) - 1] = ' ';
strlen
使用string.h
,不要忘记包含它
答案 2 :(得分:0)
fgets()
,在您键入标记后,当您按Enter键时,将'\ n'存储在变量first_name中,因此存储在first_name中的字符串为“Mark \ n”,printf()
将只执行它的工作和打印换行符。
另一个好的选择是使用fscanf()
fscanf (stdin, "%s", first_name);
修改强>
检查fscanf()
错误。
char str[50];
int bytes = -1;
fscanf (stdin, "%s%n",str,&bytes);
if(bytes == -1)
perror("\nIncomplete Bytes Parsed\n");