1

我正在尝试编写一个数据库来存储员工信息。这是我有问题的代码:

#include<stdio.h> 
int main(){
      char name[100], gender[100], email[100], id[10], phone[20];
      FILE *fPtr;
      fPtr=fopen("staffinfo.txt","w");
      FILE *fPtr1;
      fPtr1=fopen("staffinfo.txt","a+");

      if (fPtr == NULL)
      printf("Error in opening file\n");
      if (fPtr1 == NULL)
      printf("Error in opening file\n");

      printf("\n===Add New Staff Profile===");
      printf("\n\nPlease enter the following staff information.");

      printf("\n\nStaff ID: ");
      scanf("%s", &id);

      fflush(stdin);
      printf("Name\t: ");
      fgets(name,100,stdin);

      printf("Gender\t: ");
      scanf("%s", &gender);

      printf("Phone\t: ");
      scanf("%s", &phone);

      printf("Email\t: ");
      scanf("%s", &email);

      fprintf(fPtr, "Staff ID\t Name\t\t Gender\t\t Phone\t\t Email");
      fprintf(fPtr1, "\n%s\t\t %s\t\t %s\t\t %s\t %s", id, name, gender, phone, email);

      printf("\nSYSTEM: New Staff Profile is Added Successfully.");

      fclose(fPtr);
      fclose(fPtr1);
      return 0;
}

输出给出:

===Add New Staff Profile===

Please enter the following staff information.

Staff ID: 1
Name    : Carmen Gray
Gender  : Female
Phone   : 123-4567890
Email   : carmen@live.com

SYSTEM: New Staff Profile is Added Successfully.
--------------------------------
Process exited with return value 0
Press any key to continue . . .

但是, text.file 中的输出与预期不符:

Staff ID      Name        Gender         Phone       Email
1             Carmen Gray
              Female      123-4567890    carmen@live.com

问题在于这段代码:

fflush(stdin);
printf("Name\t: ");
fgets(name,100,stdin);

如果我使用 scanf 而不是 fgets,则无法存储带空格的字符串。谁能建议我如何使它工作?

4

2 回答 2

0

问题是 fgets 读取 '\n' 并将其输入到您的 char 数组中,然后将 '\0' 放在最后。所以你基本上在你的字符串中包含换行符。你要做的是删除'\n',因为它会被放置在你的输出文件中并弄乱结果。

于 2013-08-21T09:22:46.827 回答
0

好吧,你有整个字符串,你只需要在字符串的末尾放置一个空终止符或将它传递给一个新字符串:

int i = 0;
int lastPlace = 0;

for(i=0 ; i < 100 ; i++)
{
  if(name[i] == '\n')
    name[i] = '\0';
}

正如祖伯古所说:

fgets Reads characters from stream and stores them as a C string into str until 
(num-1) characters have been read or either a newline or the end-of-file is 
reached, whichever happens first.

A newline character makes fgets stop reading, but it is considered a valid 
character by the function and included in the string copied to str.

A terminating null character is automatically appended after the characters 
copied to str.

这意味着您的代码中的问题是您将换行符写入文件。删除它!

完整代码:

#include<stdio.h> 
int main(){
      char name[100], gender[100], email[100], id[10], phone[20];
      FILE *fPtr;
      fPtr=fopen("staffinfo.txt","w");
      FILE *fPtr1;
      fPtr1=fopen("staffinfo.txt","a+");

      if (fPtr == NULL)
      printf("Error in opening file\n");
      if (fPtr1 == NULL)
      printf("Error in opening file\n");

      printf("\n===Add New Staff Profile===");
      printf("\n\nPlease enter the following staff information.");

      printf("\n\nStaff ID: ");
      scanf("%s", &id);

      fflush(stdin);
      printf("Name\t: ");
      fgets(name,100,stdin);

      // MY CODE EXAMPLE HERE
      int k = 0;
      int lastPlace = 0;

      for(k=0 ; k < 100 ; k++)
      {
        if(name[k] == '\n')
        name[k] = '\0';
      }

      printf("Gender\t: ");
      scanf("%s", &gender);

      printf("Phone\t: ");
      scanf("%s", &phone);

      printf("Email\t: ");
      scanf("%s", &email);

      fprintf(fPtr, "Staff ID\t Name\t\t Gender\t\t Phone\t\t Email");
      fprintf(fPtr1, "\n%s\t\t %s\t\t %s\t\t %s\t %s", id, name, gender, phone, email);

      printf("\nSYSTEM: New Staff Profile is Added Successfully.");

      fclose(fPtr);
      fclose(fPtr1);
      return 0;
}
于 2013-08-21T09:04:15.167 回答