C字符串(字符数组):因空格而忽略下一个scanf

时间:2011-12-04 18:07:20

标签: c string

说出这样的话:

#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);
}

如果我为"asdas asdasdasd"键入fname,则不会要求我输入lname的内容。我只是想问一下如何解决这个问题,谢谢。

3 个答案:

答案 0 :(得分:5)

%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() here

答案 1 :(得分:4)

使用fgets(或getline如果您使用的是GNU)获取整行,而不是直到第一个空格。

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

查看在线工作:ideone

您还可以考虑使用this answer中的fgets_wrapper功能,因为它还会为您删除换行符。

答案 2 :(得分:1)

更改

scanf("%s", fname);

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

[^ \ n]接受“\ n”

以外的接受

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