“%s”,字符串不在字符串后打印空格

时间:2013-09-15 06:54:37

标签: c string strcat

在此代码段中:

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不能用于字符串格式吗?可能会发生什么其他想法?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

同样适用于strcpy函数调用。

答案 1 :(得分: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]);
...