与fgets意外的结果

时间:2013-03-05 09:46:20

标签: c fgets

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)。但它就像这样出现了

标记

扎克伯格

这里有什么问题?为什么中间会有新的一行?

3 个答案:

答案 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");