(在 C 中,使用 Visual Studio 2022 預覽版),我必須做一個將兩個字串鏈接在一起的程式。這是我所做的:
我寫了兩個 for 回圈來計算第一個字串和第二個字串的字符,
我檢查了(在鏈接函式內部,如果指標為空(第一個和第二個)。如果它們為空,則“回傳 NULL”。
我創建了“char *result”。這是一個新字串,這是要回傳的字串。我分配了足夠的記憶體來存盤 nprime、nsecond 和另外 1 個字符(零終止符)。我使用了malloc。
然后,我檢查了結果是否為空。如果它為空,則“回傳 NULL”。
然后,我撰寫了 2 個 for 回圈來執行第一個字串和第二個字串之間的鏈接。在這里我收到了一個編譯器警告(因為我認為它是在編譯時而不是在除錯時)。緩沖區溢位,可寫大小為“nprime nsecond 1”,但可能會寫入 2 個位元組。我的理論是程式試圖在結果陣列之外寫入,所以可能會丟失資料,我試圖編輯我的代碼,因此我寫了“nprime nsecond 2”,但它不起作用,它不斷向我顯示相同的緩沖區溢位錯誤。
#include <stdlib.h> char* link( const char* first, const char* second) { size_t nprime = 0; size_t nsecond = 0; if (first == NULL) { return NULL; } if (second == NULL) { return NULL; } for (size_t i = 0; first[i] < '\0'; i ) { nprime ; } for (size_t i = 0; second[i] < '\0'; i ) { nsecond ; } char* result = malloc(nprime nsecond 1); if (result == NULL) { return NULL; } for (size_t i = 0; i < nprime; i ) { result[i] = first[i]; } for (size_t i = 0; i < nsecond; i ) { result[nprime i] = second[i]; } result[nprime nsecond] = 0; return result; }
這是主要的:
int main(void) {
char s1[] = "this is a general string ";
char s2[] = "this is a general test.";
char* s;
s = link(s1, s2);
return 0;
}
uj5u.com熱心網友回復:
警告是由于您在前 2 個 for 回圈中定義的錯誤條件而發出的。正確的回圈應該如下:
for (size_t i = 0; first[i] != '\0'; i ) {
nprime ;
}
for (size_t i = 0; second[i] != '\0'; i ) {
nsecond ;
}
根據您定義的條件(即first[i] < '\0'),您只是計算給定字串中有多少字符的 ASCII 代碼低于 的 ASCII 代碼,\0一旦發現字符不滿足此類條件,就退出回圈。
由于'\0'ASCII 值為 0,您的 nprime 和 nsecond 永遠不會增加,導致 malloc 沒有足夠的空間容納您實際需要的字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359872.html
上一篇:圓所見的點的位置
下一篇:根據特定值多次呼叫#define
