(在 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;
}
警告是由於您在前 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 沒有足夠的空間容納您實際需要的字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句