通过动态分配的结构变量从用户获取字符串输入

时间:2016-01-29 18:46:59

标签: c string dynamic input structure

我的名字变量是一个固定变量,位于结构学生中。

当我运行我的代码时,输​​入部分会跳过名称,或者事实上,在我放置空格的任何字符变量中,都会跳过下一个字符输入。代码如下:

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

struct student{
char name[50];
char roll[10];
char batch[20];
long int mob;
};
 struct student *stud;
int main()
{
int num,i;
printf("Enter the number of students in the class: ");
scanf("%d",&num);
printf("Enter the following records: ");
FILE *fp;
fp = fopen("student.txt", "w");
for (i=0;i<num;i++)
{
    stud = (struct student *)malloc(sizeof(struct student)*num);
    printf("\nStudent %d: ",i+1);

    printf("\nEnter Name: ");

    scanf("%s",stud->name);

    printf("\nEnter Roll No.: ");
    scanf("%s",stud->roll);
    printf("\nEnter Batch: ");
    scanf("%s",stud->batch);
    printf("Enter mobile number: ");
    scanf("%ld",&stud->mob);
    fprintf(fp,"%s %s %s %ld",stud->name,stud->roll,stud->batch,stud->mob);
}
fclose(fp);
return 0;
}

2 个答案:

答案 0 :(得分:0)

scanf一旦遇到空格就停止读取字符。最好使用fgets

fgets(stud->name, 50, stdin);  

请注意,如果输入字符少于数组大小,则fgets也会读取'\n'字符。你需要照顾它。

答案 1 :(得分:0)

正确使用scanf非常困难。 一个问题是许多说明符会占用前导空格(例如%d),但有些则不会(例如%s)。

在你的情况下:

  scanf("%d",&num);              /* eats any white space BEFORE the number */
                                 /* but leaves the newline from pressing */
                                 /* enter sitting in the input buffer */

...则...

scanf("%s",stud->name);          /* because %s does NOT skip leading */
                                 /* white space, stops at the newline */

改进是:

scanf(" %.49s",stud->name);      /* skip WS, ensure no overflow */