试图建立一个结构,不让我输入一个字符串

时间:2017-08-16 03:02:27

标签: c arrays struct char

我试图使用三个变量int age,int siblings和char[] hometown来构建一个结构,但它不允许我在程序运行时插入hometown字符串。整数正常工作,但它只是跳过数组并将其留空。我尝试过使用获取和fgets,但似乎没有任何效果。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    struct person{
        int age;
        int s;
        char hometown[20];
    }p;

    printf("Age: ");
    scanf("%d",&p.age); 

    printf("Siblings: ");
    scanf("%d",&p.s);

    printf("Hometown: \n");
    fgets(p.hometown, 20, stdin);   

    printf("Age \t Siblings \t Hometown\n");
    printf("%d   \t %d        \t        %s\n",p.age,p.s,p.hometown);
}

3 个答案:

答案 0 :(得分:0)

本地变量可能已包含垃圾。

在用于字符串之前尝试memset, 这样就可以终止正确的null。

尝试通过以下扫描获取您的输入(%s,p.hometown);

对于不需要&amp;收集字符串。

如果您仍然遇到此问题,请告知我们。

答案 1 :(得分:0)

这也适用于包含空格的城镇名称,并且也可以防止缓冲区溢出。

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

#define HOMETOWN_SIZE 20

int main(){
    struct person {
        int age;
        int s;
        char hometown[HOMETOWN_SIZE + 1]; //+ 1 for terminating null character
    } p;

    printf("Age: ");
    scanf("%d", &p.age);

    printf("Siblings: ");
    scanf("%d", &p.s);

    printf("Hometown: \n");
    getchar(); //just for consume new line from previous scanf
    fgets(p.hometown, HOMETOWN_SIZE + 1, stdin); //fgets reads n-1 characters

    //don't want new line in hometown name
    if (p.hometown[strlen(p.hometown) - 1] == '\n')
        p.hometown[strlen(p.hometown) - 1] = '\0';

    printf("Age \t Siblings \t Hometown\n");
    printf("%d   \t %d        \t        %s\n", p.age, p.s, p.hometown);

    return 0;
}

答案 2 :(得分:0)

在进行字符数组输入之前尝试刷新缓冲存储器 像这样

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
 struct person{
    int age;
    int s;
    char hometown[20];
}p;

printf("Age: ");
scanf("%d",&p.age);

printf("Siblings: ");
scanf("%d",&p.s);
printf("Hometown: \n");
fflush(stdin);
fgets(p.hometown, 20, stdin);

printf("Age \t Siblings \t Hometown\n");
printf("%d   \t %d        \t        %s\n",p.age,p.s,p.hometown);
}