繁体   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