#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;
}
我正在嘗試從字串中洗掉一個字符。
在下面的代碼中,我使用了兩種方法來實作這一點,變數buffer和buffer1。但是,其中之一buffer1列印出一個奇怪的結果。
是什么讓 buffer 和 buffer1 包含不同的值?
uj5u.com熱心網友回復:
用于strcpy重疊陣列會呼叫未定義的行為。在這種情況下,您應該使用memmove.
來自 C 標準(7.23.2.3 strcpy 函式)
- ...如果復制發生在重疊的物件之間,則行為未定義。
這是一個演示程式
#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
uj5u.com熱心網友回復:
不要重疊
char *strcpy(char * restrict s1, const char * restrict s2);通知呼叫者restrict不要提供指向重疊資料的指標。
OP 的代碼使用重疊資料,因此具有未定義的行為(UB)。
不要那樣做。
可以使用memmove()which 處理重疊資料。
size_t sz = strlen(buffer1 i 1) 1;
memmove(buffer1 i, buffer1 i 1, sz);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467395.html
上一篇:在鏈表中動態存盤資料的問題
