簡體   English   中英

字符數組接受輸入,將剩余數據放入連續的字符數組

[英]Char array taking input putting remaining data to consecutive char array

我在person.h文件中定義了一個結構

struct person{
    char firstName[11];
    char familyName[21];
    char telephone[11];
    int isStudent;
};

現在我要輸入firstName,familyName等的輸入。

所以我做了這樣的事情:

void AddRecord(struct person person[20],int currentElemetCount,int maxCount){
    getFirstName(person[currentElemetCount].firstName);
    getFamilyName(person[currentElemetCount].familyName);
}

在其他commons.c文件中,我定義了這些功能,

 void getFirstName(char firstName[10]){
    printf("Enter First Name : ");
    scanf("%10s", firstName);
 }

 void getFamilyName(char familyName[20]){
    printf("Enter Family Name : ");
    scanf("%20s", familyName);
 }

但是,當我執行此程序時,在實際情況下,我希望如果用戶輸入的名字超過10個字符,則只需忽略它們。 但是在這里,它們被分配給familyName,並且不能為familyName輸入任何內容。

可能是什么原因? 請幫忙。

假設輸入的字符串“ avshgvdshvdhsdhsdhsdhdh”很長。 然后我想要firstName char數組為“ avshgvdshv”。 但是,剩下的這段代碼將“ dhsdhsdhsdhdh”字符串分配給不希望的familyName數組。

  1. 您需要清除stdin (輸入流)
  2. 使用fgets

多余的數據(超過10個字符)保留在輸入流中,並在下次調用scanf

清除stdin

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

我在自己的程序中使用的一部分代碼使用fgets獲取輸入,並清除輸入流以允許其他輸入:

fgets(c, size, stdin);
if (c[strlen(c) - 1] != '\n')
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

fgets函數接受輸入,直到遇到換行符( \\n )或已讀取最大可讀字節數(在您的情況下為10)。 通常, fgets給出一個以換行符結尾的字符串( char*\\n )。 此代碼段檢查輸入內容,以查看最后一個字符是換行符(指示長度是確定的)還是其他字符(指示它太長並且流中有額外的數據)。

您可以用scanf以這種方式丟棄前10個字符之后的所有字符

scanf("%10s%*s", firstName);

在這種情況下, %*s表示掃描字符串,但不將其存儲到變量中。 請注意,在這種情況下scanf將停止對任何空白char進行掃描。 如果您輸入的字符串中的空格會引起問題

您需要清除標准輸入流的內容。 可以通過更改以下內容來完成:

scanf("%10s", firstName);
scanf("%20s", familyName);

scanf("%10s%*[^\n]", firstName);scanf("%*c");
scanf("%20s%*[^\n]", familyName);scanf("%*c");

%*[^\\n]指示scanf掃描並丟棄所有內容,直到換行符( '\\n' )。 %*c指示scanf掃描並丟棄一個字符,在這種情況下,該字符可能是換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM