确定 C 缓冲区中的多个 space 分隔输入
Determining multiple space separated inputs in C buffer
我在为我的命令解释器读取输入时一直试图证明我的逻辑。我 运行 遇到的问题是 strstr()
要么不接受 "%s"
作为 针 要么正在处理整个 haystack 作为字符串,因此忽略 spaces、换行符等。
char command[4] = "";
char arg1[512] = "";
char arg2[512] = "";
char tmp[1029] = "";
char buffer[BUFFERSIZE];
memset(buffer, '[=11=]', BUFFERSIZE);
while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
strcpy(command, "");
strcpy(arg1, "");
strcpy(arg2, "");
strcpy(tmp, "");
if(strstr(buffer, "%s\n") != NULL)
sscanf(buffer, "%s", command); // 0 arguments
if(strstr(buffer, "%s %s") != NULL)
sscanf(buffer, "%s", arg1); // 1 argument
if(strstr(buffer, "%s %s %s") != NULL)
sscanf(buffer, "%s", arg2); // 2 arguments
printf("%s %s %s\n", command, arg1, arg2);
}
无论我输入什么:
- com
- val argument1val
- cmd arg1 arg2val
- 等等
我总是以 command
、arg1
和 arg2
的空字符数组结束。
我的输入始终是单个字符串或最多三个 space 分隔的字符串,后跟一个换行符。
strstr
函数不使用printf
风格的格式字符串。它在第一个参数中查找第二个参数的确切内容。
您想要使用的是 strtok
,它将根据分隔符拆分字符串,在本例中为 space.
char *p;
p = strtok(buffer, " ");
if (p) {
strcpy(command, p);
p = strtok(NULL, " ");
if (p) {
strcpy(arg1, p);
p = strtok(NULL, " ");
if (p) {
strcpy(arg2, p);
}
}
}
您只需扫描一次并检查 sccanf
returns 的已解析参数的数量(特别检查输入的空行)
#include <stdio.h>
#include <strings.h>
#define BUFFERSIZE 2000
int main()
{
int nb_args;
char command[4] = "";
char arg1[512] = "";
char arg2[512] = "";
char buffer[BUFFERSIZE];
memset(buffer, '[=10=]', BUFFERSIZE);
while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
strcpy(command, "");
strcpy(arg1, "");
strcpy(arg2, "");
nb_args = sscanf(buffer, "%3s%511s%511s", command,arg1,arg2);
if (strlen(command)==0)
{
printf("empty line\n");
}
else
{
switch(nb_args)
{
case 1:
printf("Command = %s\n",command);
break;
case 2:
printf("Command = %s, arg1 = %s\n",command,arg1);
break;
case 3:
printf("Command = %s, arg1 = %s, arg2 = %s\n",command,arg1,arg2);
break;
}
}
}
}
您很快就会需要一个正确的答案。
这是通过删除前导和尾随白色space来获取包含任意白色space,trim的字符串,然后将所有白色space字符替换为单个[=14] =]秒。然后构建一个单词列表,知道单个 space 是分隔符。
还有其他方法,但如果您编写此函数,它将让您了解字符串在内存中的布局方式以及如何操作它们。
我在为我的命令解释器读取输入时一直试图证明我的逻辑。我 运行 遇到的问题是 strstr()
要么不接受 "%s"
作为 针 要么正在处理整个 haystack 作为字符串,因此忽略 spaces、换行符等。
char command[4] = "";
char arg1[512] = "";
char arg2[512] = "";
char tmp[1029] = "";
char buffer[BUFFERSIZE];
memset(buffer, '[=11=]', BUFFERSIZE);
while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
strcpy(command, "");
strcpy(arg1, "");
strcpy(arg2, "");
strcpy(tmp, "");
if(strstr(buffer, "%s\n") != NULL)
sscanf(buffer, "%s", command); // 0 arguments
if(strstr(buffer, "%s %s") != NULL)
sscanf(buffer, "%s", arg1); // 1 argument
if(strstr(buffer, "%s %s %s") != NULL)
sscanf(buffer, "%s", arg2); // 2 arguments
printf("%s %s %s\n", command, arg1, arg2);
}
无论我输入什么:
- com
- val argument1val
- cmd arg1 arg2val
- 等等
我总是以 command
、arg1
和 arg2
的空字符数组结束。
我的输入始终是单个字符串或最多三个 space 分隔的字符串,后跟一个换行符。
strstr
函数不使用printf
风格的格式字符串。它在第一个参数中查找第二个参数的确切内容。
您想要使用的是 strtok
,它将根据分隔符拆分字符串,在本例中为 space.
char *p;
p = strtok(buffer, " ");
if (p) {
strcpy(command, p);
p = strtok(NULL, " ");
if (p) {
strcpy(arg1, p);
p = strtok(NULL, " ");
if (p) {
strcpy(arg2, p);
}
}
}
您只需扫描一次并检查 sccanf
returns 的已解析参数的数量(特别检查输入的空行)
#include <stdio.h>
#include <strings.h>
#define BUFFERSIZE 2000
int main()
{
int nb_args;
char command[4] = "";
char arg1[512] = "";
char arg2[512] = "";
char buffer[BUFFERSIZE];
memset(buffer, '[=10=]', BUFFERSIZE);
while(fgets(buffer, BUFFERSIZE, stdin) != NULL){
strcpy(command, "");
strcpy(arg1, "");
strcpy(arg2, "");
nb_args = sscanf(buffer, "%3s%511s%511s", command,arg1,arg2);
if (strlen(command)==0)
{
printf("empty line\n");
}
else
{
switch(nb_args)
{
case 1:
printf("Command = %s\n",command);
break;
case 2:
printf("Command = %s, arg1 = %s\n",command,arg1);
break;
case 3:
printf("Command = %s, arg1 = %s, arg2 = %s\n",command,arg1,arg2);
break;
}
}
}
}
您很快就会需要一个正确的答案。 这是通过删除前导和尾随白色space来获取包含任意白色space,trim的字符串,然后将所有白色space字符替换为单个[=14] =]秒。然后构建一个单词列表,知道单个 space 是分隔符。
还有其他方法,但如果您编写此函数,它将让您了解字符串在内存中的布局方式以及如何操作它们。