为什么 strcpy(buffer +i, buffer + i +1) 的工作方式与使用临时数组不同?
Why strcpy(buffer +i, buffer + i +1) doesn't work in the same way as using a temporay array?
#include <stdio.h>
#include <string.h>
int main() {
char buffer[200] = "This is a string";
char buffer1[200];
strcpy(buffer1, buffer);
char vowels[] = "aeiouAEIOU";
int i;
for (i = 0; i < strlen(buffer); i++) {
if (strchr(vowels, buffer[i]) != NULL) {
char tmp[1000];
strcpy(tmp, buffer + i + 1);
strcpy(buffer + i, tmp);
strcpy(buffer1 + i, buffer1 + i + 1);
break;
}
}
printf("buffer=%s\n", buffer); // prints "Ths is a string", which is OK
printf("buffer1=%s\n", buffer1); // prints "Ths is asstring", which is not OK.
return 0;
}
我正在尝试从字符串中删除一个字符。
在下面的代码中,我使用了 2 种方法来实现这一点,使用变量 buffer 和 buffer1。但是,其中一个,buffer1,打印出一个奇怪的结果。
什么使缓冲区和缓冲区 1 包含不同的值?
不重叠
char *strcpy(char * restrict s1, const char * restrict s2);
有 restrict
通知调用者不要提供指向重叠数据的指针。
OP 的代码使用了重叠数据,因此具有 未定义的行为 (UB)。
不要那样做。
可以使用 memmove()
处理重叠数据。
size_t sz = strlen(buffer1 + i + 1) + 1;
memmove(buffer1 + i, buffer1 + i + 1, sz);
对重叠数组使用 strcpy
会调用未定义的行为。在这种情况下,您应该使用 memmove
.
来自C标准(7.23.2.3 strcpy函数)
- ... If copying takes place between objects that overlap, the
behavior is undefined.
这是一个演示程序
#include <stdio.h>
#include <string.h>
int main( void )
{
char buffer[200] = "This is a string";
char vowels[] = "aeiouAEIOU";
size_t n = strlen( buffer );
size_t pos = strcspn( buffer, vowels );
memmove( buffer + pos, buffer + pos + 1, n - pos );
puts( buffer );
}
程序输出为
Ths is a string
#include <stdio.h>
#include <string.h>
int main() {
char buffer[200] = "This is a string";
char buffer1[200];
strcpy(buffer1, buffer);
char vowels[] = "aeiouAEIOU";
int i;
for (i = 0; i < strlen(buffer); i++) {
if (strchr(vowels, buffer[i]) != NULL) {
char tmp[1000];
strcpy(tmp, buffer + i + 1);
strcpy(buffer + i, tmp);
strcpy(buffer1 + i, buffer1 + i + 1);
break;
}
}
printf("buffer=%s\n", buffer); // prints "Ths is a string", which is OK
printf("buffer1=%s\n", buffer1); // prints "Ths is asstring", which is not OK.
return 0;
}
我正在尝试从字符串中删除一个字符。
在下面的代码中,我使用了 2 种方法来实现这一点,使用变量 buffer 和 buffer1。但是,其中一个,buffer1,打印出一个奇怪的结果。
什么使缓冲区和缓冲区 1 包含不同的值?
不重叠
char *strcpy(char * restrict s1, const char * restrict s2);
有 restrict
通知调用者不要提供指向重叠数据的指针。
OP 的代码使用了重叠数据,因此具有 未定义的行为 (UB)。
不要那样做。
可以使用 memmove()
处理重叠数据。
size_t sz = strlen(buffer1 + i + 1) + 1;
memmove(buffer1 + i, buffer1 + i + 1, sz);
对重叠数组使用 strcpy
会调用未定义的行为。在这种情况下,您应该使用 memmove
.
来自C标准(7.23.2.3 strcpy函数)
- ... If copying takes place between objects that overlap, the behavior is undefined.
这是一个演示程序
#include <stdio.h>
#include <string.h>
int main( void )
{
char buffer[200] = "This is a string";
char vowels[] = "aeiouAEIOU";
size_t n = strlen( buffer );
size_t pos = strcspn( buffer, vowels );
memmove( buffer + pos, buffer + pos + 1, n - pos );
puts( buffer );
}
程序输出为
Ths is a string