0

在此代码段中:

printf("shell> ");
fgets(input, MAX_INPUT_SIZE, stdin);

//tokenize input string, put each token into an array
char *space;
space = strtok(input, " ");
tokens[0] = space;

int i = 1;
while (space != NULL) {
  space = strtok(NULL, " ");
  tokens[i] = space;
  ++i;
}

//copy tokens after first one into string
strcpy((char*)cmdargs, ("%s ",tokens[1]));
for (i = 2; tokens[i] != NULL; i++) {
  strcat((char*)cmdargs, ("%s ", tokens[i]));
}

printf((char*)cmdargs);

输入: echo hello world and stuff,程序打印:

helloworldandstuff

在我看来,该行strcat((char*)cmdargs, ("%s ", tokens[i]));应该将 tokens[i] 处的字符串与后面的空格连接起来。strcat 不适用于字符串格式吗?任何其他想法可能会发生什么?

4

2 回答 2

4

strcat不支持格式化字符串,它只是进行连接。此外,您使用额外的一对括号会导致 C 编译器将其解析为逗号运算符,而不是作为传递给函数的参数。

也就是说,strcat((char*)cmdargs, ("%s ", tokens[i]));将导致调用strcat((char*)cmdargs, tokens[i]);作为逗号运算符调用所有表达式的副作用,但返回最后一个值。

如果你想使用strcat,你应该写:

strcat((char*)cmdargs, " ");
strcat((char*)cmdargs, tokens[i]);

同样的事情也适用于strcpy函数调用。

于 2013-09-15T07:00:00.047 回答
2

编写您自己的格式化字符串连接函数版本,如果这是您想要的:

(未经测试)

int strcatf(char *buffer, const char *fmt, ...) {
    int retval = 0;
    char message[4096];
    va_list va;
    va_start(va, fmt);
    retval = vsnprintf(message, sizeof(message), fmt, va);
    va_end(va);
    strcat(buffer, message);
    return retval;
}


...
strcatf((char*)cmdargs, "%s ", tokens[i]);
...
于 2013-09-15T07:23:15.627 回答