我正在研究一个用C语言编写的项目,我想要做的是从参数中获取值然后发送到微控制器[pic16f887]然后在微控制器上使用字符串X的另一个代码(例如:x = 1234567890) )我发送,我想读取字符x [0]到x [3]并将值保存在包含D = 1234的其他字符D中。然后从x [4]到x [8]保存在包含F的字符F中= 5678。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <unistd.h>
char a[50];
char d[50];
char c[50];
int main(int argc, const char * argv[]) {
strcpy(a, argv[1]);
strcpy(d, argv[2]);
strcpy(c, argv[3]);
strcpy(a, d);
strcpy(a, c);
printf("%s",a);
return 0;
}
这只是一个测试,看看它是如何工作的..但是只输出第三个参数而不是一次输出所有3个参数。 所以我的问题是我如何将这三个字符组合起来然后从一个读取从x [0]到x [3]再保存在一个我可以处理的单独字符中
答案 0 :(得分:1)
如果我正确理解你的问题,你会尝试连接传递给你的程序的前3个参数。
您遇到的问题是strcpy
始终从一开始就复制到缓冲区a
,而您假设它将附加到已存储在a
中的字符串中。观察该行为的一种方法是将长度递减的命令行参数传递给程序。例如,将其称为./a.out abcde ghij klm
将打印klmje
,而不是第3个参数。
你真正需要做的是记住你到目前为止所复制的内容的长度,并在缓冲区的开头a
之后开始这么多字符。事实上,除了a
之外,你甚至不需要额外的缓冲区,缓冲区也不需要是全局的。
以下内容应该符合您的期望:
int main(int argc, const char * argv[]) {
char a[50];
char* beginning_of_next_string = a;
int i = 1;
for (; i <= 3; ++i) {
strcpy(beginning_of_next_string, argv[i]);
beginning_of_next_strings += strlen(argv[i]);
}
printf("%s",a);
return 0;
}
或者,因为在这种情况下,刺痛不会很长,所以您也可以使用Vasilis建议的strcat
来评论您的问题而不会造成很大的性能损失。然后它减少到
int main(int argc, const char * argv[]) {
char a[50];
strcpy(a, argv[1]);
strcat(a, argv[2]);
strcat(a, argv[3]);
printf("%s",a);
return 0;
}