我正在用C ++编写一个程序,该程序使用以下函数,该函数有两个字符指针(当然,作为字符串)作为其形式参数:
void takeword (char *dstr, const char *from)
{
int i=0, j=0;
printf ("\n %s", dstr);
getch();
exit(0);
while (!isalpha(from[i])) //positioning to the first letter in te line
i++;
do
{
dstr[j]=from[i];
j++;
i++;
}while (isalpha(from[i]));
dstr[j]='\0'; //terminating the word with a null character
};
我的问题是两个字符串dstr和from被分配了相同的内存空间 因此,在dstr中进行的更改正在反映在我不想要的内容中。
那么,如何确保为它们分配不同的内存位置呢?
答案 0 :(得分:0)
您提供的代码无法以令人满意的方式处理的唯一情况是dstr > from && dstr < from + strlen(from)
。
要解决此问题,您有三种选择:
您可以通过确保正确操作的方式编写函数,而不管两个字符串是否重叠。这可能涉及临时缓冲区。
您在函数声明中记录该函数无法正确处理重叠缓冲区,并确保调用代码不违反此限制。在这种情况下,您可以考虑将restrict
关键字添加到函数参数中,以便向程序员和编译器(可以进行其他优化)记录此假设。插入{也是一个好主意。 {1}}检查重叠条件。
你走向相反的方向并将函数签名更改为assert()
并记录它将第一个单词移动到字符串的开头并添加一个终止空字符。
由您决定在您的情况下您更喜欢哪种解决方案,这取决于手头的用例。