4
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);
}

结果并没有像我预期的那样出现......我的意思是名字和姓氏在一行中(例如马克扎克伯格)。但结果是这样的

标记

扎克伯格

这里有什么问题?为什么中间有一条新线?

4

3 回答 3

4

见手册页

引用:

fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 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;
}
于 2013-03-05T09:49:31.143 回答
1

正如 Ed 所建议的,请参阅手册,'\n'' '(simple space) 替换的简单方法可能是:

first_name[strlen(first_name) - 1] = ' ';

strlen使用string.h,不要忘记包含它

于 2013-03-05T10:00:09.840 回答
0

fgets(), 将 '\n' 存储在变量 first_name 中,当您按 Enter 时,在您键入 Mark 后,因此存储在 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");
于 2013-03-05T10:05:42.443 回答