在此代码段中:
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不能用于字符串格式吗?可能会发生什么其他想法?
答案 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]);
...