我想从用户那里得到一个最大长度为30个字符串的输入,并检查它是否包含行尾。
这是我到目前为止所写的内容:
int main(void) {
int i;
char* command = (char*)calloc(31, sizeof(char));
while (0 < 1) {
scanf("%s", command);
for (i = 0; i <= strlen(command); ++i) {
if (command[i] == '\n')
printf("here");
}
if (strcmp(command, "quit") == 0)
break;
}
想法是检查用户作为输入给出的命令是否是“合法的” - 长度&lt; 31。 当我运行这段代码时,无论输入的长度如何,它都不会打印“here”。
答案 0 :(得分:5)
这是因为scanf()
不包含换行符,它认为它是空格并使用空格来分隔它转换的值。只需使用strlen()
的返回值。
答案 1 :(得分:5)
scanf
不包含终止'\n'
,但fgets
不会:
换行符使fgets停止读取,但它被认为是有效字符,因此它包含在复制到str的字符串中。
只需将scanf
行更改为:
fgets(command, 31, stdin);
答案 2 :(得分:1)
使用fgets(有关man fgets的更多信息),您正在读取的流是stdin。
它看起来像这样:
fgets(command, 31, stdin);
在字符串的末尾(如果没有错误),您可以查找'\ 0'。它将附加到字符串的末尾(这就是为什么我使用31而不是30的大小)。
此外,您可以使用fgets从任何流中读取(即文件,错误等)。我建议学习它是如何工作的,因为它比scanf更灵活。
希望有所帮助。