C 如何读取带空格的结构中的字符串?

C 如何读取带空格的结构中的字符串?,c,struct,C,Struct,我们的公司办公室需要一个应用程序,该应用程序将维护钦奈的所有注册大学,并且该应用程序在搜索大学时应方便用户。创建一个名为“University”的结构,该结构具有以下属性:名称、许可证号和区号 要求:大学的许可证编号应为6位,前2位必须为大写字母,后4位必须为数字 #include <stdio.h> #include <stdlib.h> #include <string.h> struct University { char name[100];

我们的公司办公室需要一个应用程序,该应用程序将维护钦奈的所有注册大学,并且该应用程序在搜索大学时应方便用户。创建一个名为“University”的结构,该结构具有以下属性:名称、许可证号和区号

要求:大学的许可证编号应为6位,前2位必须为大写字母,后4位必须为数字

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct University
{
  char name[100];
  char license[10];
  int area;

}u[10];

void main()
{
  int i, n, r, k = 0, flag = 1, f2 = 1, j, search = 0;
  char s[100];
  printf("Enter the number of records\n");
  scanf("%d", &n);
  printf("Enter the details of %d universities\n", n);

  for (i = 0; i<n; i++)
  {
    printf("Name of the University\n");
    getchar();
    scanf("%s", u[i].name);
    j = strlen(u[i].name);
    if (j <= 1)
    {
      f2 = 0;
      break;
    }
    printf("License Number\n");

    scanf("%s", u[i].license);
    k = strlen(u[i].license);
    if (k<1)
    {
      f2 = 0;
      break;
    }

    if (k<6)
    {
      flag = 0;
    }
    else if ((u[i].license[0] >= 'A' && u[i].license[0] <= 'Z') && (u[i].license[1] >= 'A' && u[i].license[1] <= 'Z') && (u[i].license[2] >= '0' && u[i].license[2] <= '9') && (u[i].license[3] >= '0' && u[i].license[3] <= '9') && (u[i].license[4] >= '0' && u[i].license[4] <= '9') && (u[i].license[5] >= '0' && u[i].license[5] <= '9') && k == 6)
    {
      flag = 1;
    }
    else
    {
      flag = 0;
    }
    printf("Area Code\n");
    scanf("%d", &u[i].area);
    //printf("%d",u[i].area);
    if (u[i].area <= 0)
    {
      f2 = 0;
    }

  }
  if (flag == 0)
  {
    printf("Sorry! You have entered incorrect license number.");
  }
  else if (f2 == 0)
  {
    printf("Unable to continue");
  }
  else
  {
    printf("Enter the name of the University to be searched\n");
    scanf("%s", s);
    for (i = 0; i<n; i++)
    {
      if ((strcmp(u[i].name, s)) == 0)
      {
        search = 1;
      }
    }
    if (search == 1)
    {
      printf("University is licensed one.");
    }
    else
    {
      printf("University is not found.");
    }
  }
}
#包括
#包括
#包括
结构大学
{
字符名[100];
字符许可证[10];
内部区域;
}u[10];
void main()
{
int i,n,r,k=0,flag=1,f2=1,j,search=0;
chars[100];
printf(“输入记录数\n”);
scanf(“%d”和“&n”);
printf(“输入%d所大学的详细信息,\n”,n);

对于(i=0;i,您似乎只对读取包含空格的c字符串感兴趣。为此,您可以使用
fgets
。下面是一个玩具程序:

#include <stdio.h>
#include <string.h>

struct s {
    char name[100];
    int something;
};

int main(void)
{
    struct s myStruct;
    printf("%s", "Enter name: ");
    fgets(myStruct.name, 100, stdin);

    myStruct.name[strlen(myStruct.name) - 1] = '\0'; //This should remove the newline char at the end
    printf("Name is: %s", myStruct.name);
}
#包括
#包括
结构{
字符名[100];
智力的东西;
};
内部主(空)
{
结构的myStruct;
printf(“%s”,“输入名称:”);
fgets(myStruct.name,100,标准名称);
myStruct.name[strlen(myStruct.name)-1]='\0';//这将删除末尾的换行符
printf(“名称为:%s”,myStruct.Name);
}

请给出一些输入和预期/实际输出的示例。整个程序逻辑错误且过于复杂。使用
scanf
读取用户输入的用途有限,因为它忽略了新行。它需要更多的错误检查。特别是,如果下一个标记不是一个标记,
%d
格式将不会消耗流编号和
%s
格式将只读取到下一个空格的字符串。如果您输入的是“New Delhi”、“AA9876”和“123”,则名称为“New”,许可证为“Delhi”而且该区域根本不会被读取。丢失所有标志,改用正则表达式。告诉我如何在结构化数组中读取带空格的字符串,因为我多次遇到这个问题:
myStruct.name[strlen(myStruct.name)-1]
允许黑客通过在
fgets()中输入一个空字符作为第一个字符进行攻击<代码> > MyStult.Name(0)='' 0′] < <代码> >或简单地使用<代码> MyStult.Name [ STRCSPN(MyStult.Name),\n′] ];< /Cord> @ CHUX谢谢您指出这一点。我还在学习。BTW:考虑删除“您的程序过于复杂和过于复杂”。因为它并没有给这个答案增加客观的价值。我也使用了它。但它也创造了同样的价值error@PrakharDubey什么错误?复制粘贴我的玩具程序,看看是否有“错误”。