簡體   English   中英

C字符串(字符數組):因空格而忽略下一個scanf

[英]C string(char array): ignores next scanf because of spaces

說這樣的話:

#include <stdio.h>

void main() {

  char fname[30];
  char lname[30];

  printf("Type first name:\n");
  scanf("%s", fname);

  printf("Type last name:\n");
  scanf("%s", lname);

  printf("Your name is: %s %s\n", fname, lname);
}

如果我為fname鍵入"asdas asdasdasd" ,它將不會要求我輸入lname 我只是想問一下如何解決這個問題,謝謝。

%s放在格式列表中會使scanf()讀取字符,直到找到空格 您的輸入字符串包含空格,因此第一個scanf()僅讀取asdas scanf()被認為是危險的(想想如果輸入超過30個字符會發生什么),這就是為什么如其他人所指出你應該使用fgets()

您可以這樣做:

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

int main()
{
    char fname[30];
    char lname[30];

    printf("Type first name:\n");
    fgets(fname, 30, stdin);

    /* we should trim newline if there is one */
    if (fname[strlen(fname) - 1] == '\n') {
        fname[strlen(fname) - 1] = '\0';
    }

    printf("Type last name:\n");
    fgets(lname, 20, stdin);
    /* again: we should trim newline if there is one */
    if (lname[strlen(lname) - 1] == '\n') {
        lname[strlen(lname) - 1] = '\0';
    }

    printf("Your name is: %s %s\n", fname, lname);

    return 0;
}

但是這段代碼仍然不完整。 你仍然應該檢查fgets()是否遇到了一些錯誤。 這里閱讀有關fgets()更多信息

使用fgets (如果使用GNU則使用getline )來獲取整行,而不是直到第一個空格。

if (fgets(fname, 30, stdin) == NULL) {
    // TODO: Read failed: handle this.
}

看到它在線工作: ideone

您還可以考慮使用此答案中的函數fgets_wrapper ,因為它還會為您刪除換行符。

更改

scanf("%s", fname);

scanf("%[^\n]%*c", fname);

[^ \\ n]接受'\\ n'以外的接受

%* c忽略一個字符('\\ n')

暫無
暫無

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

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