%s 指令在存储字符之前将字符匹配到一个空格,因此无法以这种方式获取输入行。还有其他方法可以使用scanf() 来读取输入行,但这些方法容易出错,而且这确实不是适合这项工作的工具。
最好使用fgets() 将一行输入提取到缓冲区,并使用sscanf() 解析缓冲区。由于这里的要求是输入四个字符串,所以使用这种方法是一个简单的问题:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[10],str2[10],str3[10],str4[10];
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
fprintf(stderr, "Error in fgets()\n");
return 1;
}
if (sscanf(buffer, "%9s%9s%9s%9s", str1, str2, str3, str4) == 4) {
if (strcmp(str1,"MAHIRL") == 0 &&
strcmp(str2,"CHITRA") == 0 &&
strcmp(str3,"DEVI") == 0 &&
strcmp(str4,"C") == 0 ){
printf("yes\n");
} else {
printf("no\n");
}
} else {
printf("Input requires 4 strings\n");
}
return 0;
}
声明了一个额外的字符数组buffer[],有足够的额外空间来容纳额外的输入;这样,如果用户输入了一些额外的字符,就不太可能干扰程序的后续行为。注意fgets()如果有错误返回一个空指针,所以这个被检查了;如果在此处遇到错误,则会打印一条错误消息并退出程序。
然后sscanf()用于解析buffer[]。请注意,最大宽度是使用 %s 指令指定的,以避免缓冲区溢出。 fgets() 函数将换行符存储在buffer[] 中(如果有空间),但是以这种方式使用sscanf() 可以避免需要进一步处理这个换行符。
还要注意sscanf() 返回成功分配的数量;如果此返回值不是4,则输入与预期不符,不应使用str1,...,str4 保存的值。
更新
再次看这个问题,我不确定我是否真的回答了它。起初我以为您想使用scanf() 读取一行输入,并从中提取字符串。但是您说:“只要字符串中有空格,就不要将其视为 2 个字符串”,即使您的示例代码中的测试输入都不包含此类空格。
将包含空格的用户输入读入字符串的一个选项是对每个字符串单独调用fgets()。如果将结果直接存储在str1,...,str4 中,则需要删除fgets() 保留的换行符。更好的方法是将结果再次存储在buffer 中,然后使用sscanf() 提取字符串,这次包括空格。这可以使用 scanset 指令来完成:
fgets(buffer, sizeof buffer, stdin);
sscanf(buffer, " %9[^\n]", str1);
这里的格式字符串包含一个前导空格,告诉sscanf() 跳过零个或多个前导空白字符。 %[^\n] 指令告诉sscanf() 匹配字符,包括空格,直到遇到换行符,将它们存储在str1[] 中。请注意,指定的最大宽度为 9,为 \0 终止符留出了空间。
如果您希望能够在用户输入的同一行 上输入多个字符串,每个字符串都包含空格,则需要选择一个分隔符。选择一个逗号,这可以通过:
fgets(buffer, sizeof buffer, stdin);
sscanf(buffer, " %9[^,], %9[^,], %9[^,], %9[^,\n]", str1, str2, str3, str4);
这里和之前一样有一个前导空格,用于跳过输入中可能存在的任何杂散空白字符(例如\n 字符)。 %[^,] 指令告诉sscanf() 匹配字符直到遇到逗号,并将它们存储在适当的数组中(str1[],...,str3[])。以下, 告诉sscanf() 在下一个扫描集指令之前匹配一个逗号和零个或多个空白字符。最后一个指令是%[^,\n],告诉sscanf() 匹配字符,直到遇到逗号或换行符。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[10],str2[10],str3[10],str4[10];
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
fprintf(stderr, "Error in fgets()\n");
return 1;
}
/* Each individual string str1,..., str4 may contain spaces */
if (sscanf(buffer, " %9[^,], %9[^,], %9[^,], %9[^,\n]",
str1, str2, str3, str4) == 4) {
if (strcmp(str1,"test 1") == 0 &&
strcmp(str2,"test 2") == 0 &&
strcmp(str3,"test 3") == 0 &&
strcmp(str4,"test 4") == 0 ){
printf("yes\n");
} else {
printf("no\n");
}
} else {
printf("Input requires 4 comma-separated strings\n");
}
return 0;
}
这是与这个最终程序的交互示例:
test 1, test 2, test 3, test 4
yes