我遇到了以下循环的问题。我们的想法是遍历一个字符串并获取每两个值(特别是十六进制),然后将该值存储到一个数组中。然后该字符串的长度将减少2,因为这两个值将不会包含在下一次迭代中。
我一直遇到的问题是字符串的最后两个字符会被添加到每个新副本中。第一个副本可以,然后第二个副本将最后两个字符附加到字符串(因此最后两个元素的两个副本将位于字符串的末尾),然后第三个将再次附加值和它永远不会停止。
我有什么东西在这里失踪吗?是否有更好的方法解决这个问题?
PC = d; //assign counter the value of the address
unsigned int c;
char copy[500]; //copy of instruction set
int i = 0;
while (strlen(value) > 0) {
sscanf(value,"%2x",&c); //get every two hex chars from string and that value to c
allocMem[d+i] = (char) c; //put value of c in array
strncpy(copy,value+2,strlen(value)-2); //get a copy of new value of the string
strcpy(value,copy); //copy new value to value variable
i += 2;
d++;
}
答案 0 :(得分:1)
函数strncpy
不会终止新字符串,因为它在找到终结符之前达到了给定的长度限制。因此,当您strcpy
返回原始字符串时,您不会将字符串传递给strcpy
,而是传递给未终止的数组。
要包含终止符,您必须使复制长度超过strlen(value)-2
strncpy(copy, value+2, strlen(value) - 1);
或者,为了节省来回复制的麻烦,您可以通过使用指针来简化它,例如在此示例中:
#include <stdio.h>
int main(void){
char value[] = "abcdef";
char *ptr = value;
unsigned c;
while(sscanf(ptr, "%2x", &c) == 1) {
printf("%X\n", c);
ptr += 2;
}
}
节目输出
AB
CD
EF