插入一定数量的包含空格的字符

时间:2018-06-20 01:22:45

标签: c

我要完成的工作是接受不超过“ x”个字符(包括空格)作为输入。我只知道如何分别用scanf做这两个事情,

类似于以下内容:

scanf("%20s",str)

这不超过20个字符。

scanf("%[^\n]s",str)也可以带空格,但没有限制。 我尝试过getline,但是它也将\n作为字符串中的值,我不希望这样。我希望我对自己的要求已经足够清楚。

根据@chqrlie告诉我的内容,我编写了此功能:

void getstring(char *str, int len)
{
    do
    {
        if (fgets(str, len, stdin))
        {
            fflush(stdin);
// if is not the first character to be the new line then change it to '\0' which is the end of the string.
            if (str[0] != '\n')
                str[strcspn(str, "\n")] = '\0';
        }
    }while (str[0] == '\n'); // Check if the user has inserted a new line as first character
}

2 个答案:

答案 0 :(得分:2)

字符类的格式没有结尾的s,它是这样写的:

scanf("%[^\n]", str)

如果您希望限制存储在目标数组中的最大字符数,请在%[之间指定此数字:

scanf("%20[^\n]", str)

但是请注意,如果此转换规范中有待处理的空行,转换将失败,并且scanf()将返回0

省略测试scanf()的返回值是一个常见错误,在转换失败的情况下会导致不确定的行为,因为目标变量保持其先前状态(在许多情况下未初始化)。

使用fgets()并以这种方式删除尾随的换行符可能更有效:

if (fgets(s, 20, stdin)) {
    /* line was read, can be an empty line */
    s[strcspn(s, "\n")] = '\0';  /* remove the trailing newline if any */
    ...
} else {
    /* fgets() failed, either at end-of-file or because of I/O error */
    ...
}

答案 1 :(得分:1)

您可以使用以下内容:

for(i = 0; i < x; i++) 
{
    getchar(c);
    if(c == '\n') break;
    str[i] = c; 
}

但是您必须知道缓冲区中的现有换行符。 :)