我要完成的工作是接受不超过“ 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
}
答案 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;
}
但是您必须知道缓冲区中的现有换行符。 :)