我一直在研究一个问题。我需要扫描\n
以结束循环,并删除它以使其不与其他文本一起保留在变量中。到目前为止,我有这个:
do {
scanf("%[^\n]", userinput); //loads stdin to char[] variable
end = userinput[0]; //loads one char to char variable
scanf("%*c"); //should remove \n
strcpy(inputstorage[i], userinput); //copies userinput into 2d array of
i++; //string with \n removed
} while (end != '\n'); //should end cycle when I hit enter
这是什么,当我按Enter时,它将最后一个字符保留在变量结尾。
例如,我输入:'Hello
'
在userinput
中是:'Hello
'
在end
中是'H
'
当我按下回车键时,结束变量应包含\ n,但出于某些原因它应包含'H
'。感谢您能提供的所有帮助
答案 0 :(得分:2)
答案 1 :(得分:2)
end = userinput[0];
保存输入的第一个字符。 scanf("%[^\n]", userinput);
不会在'\n'
中放入userinput[]
,因此测试end
是否为行尾是没有用的。
使用fgets()
读一行
char userinput[100];
if (fgets(userinput, sizeof userinput, stdin)) {
然后通过various means断开电位 '\n'
。
size_t len = strlen(userinput);
if (len > 0 && userinput[len-1] == '\n') userinput[--len] = '\0';
如果代码必须使用scanf()
,
int count;
do {
char userinput[100];
// Use a width limiter and record its conversion count : 1, 0, EOF
// scanf("%[^\n]", userinput);
count = scanf("%99[^\n]", userinput);
// Consume the next character only if it is `'\n'`.
// scanf("%*c");
scanf("%*1[\n]");
// Only save data if a non-empty line was read
if (count == 1) {
strcpy(inputstorage[i], userinput);
i++;
}
} while (count == 1);
// Input that begins with '\n' will have count == 0
重新形成的循环可以使用
char userinput[100];
int count;
while ((count = scanf("%99[^\n]", userinput)) == 1) {
scanf("%*1[\n]");
strcpy(inputstorage[i++], userinput);
}
scanf("%*1[\n]");
请注意OP的代码在'/n'
中使用while (end != '/n');
。这不是行字符'\n'
的结尾,而是很少使用的多字符常量。当然不是OP想要的。它还暗示警告未完全启用。节省时间启用所有警告。 @aschepler。