我撰寫了一個程式來檢查給定字串是否所有字符都是唯一的。我通常用 Python 撰寫代碼,但我正在學習 C ,我想用它撰寫程式。將 Python 翻譯成 C 時出現錯誤:執行緒 1: EXC_BAD_ACCESS (code=257, address=0x100000001)
我正在使用 Xcode。當我運行這個程式時,我得到了上面的錯誤:
#include <iostream>
using namespace std;
int isUnique(string str) {
int arr[] = {};
for (int i = 0; i < str.length(); i) {
arr[i] = 0;
}
for (int j = 0; j < str.length(); j) {
arr[j] = 1;
}
for (int k = 0; k < sizeof(arr)/sizeof(arr[0]); k) {
if (arr[k] > 1) {
return false;
}
}
return true;
}
int main() {
string str;
cout << "Enter a string: ";
getline(cin, str);
cout << isUnique(str) << endl;
}
這是我用 Python 撰寫的原始代碼:
def is_unique(string):
chars = []
for i in range(len(string)):
chars.append(0)
chars[string.find(string[i])] = 1 # I am using find and not just i because I want the first occurrence of the substring in the string to update it to 2 if it happens twice, 3 if it is thrice, etc.
for k in chars:
if k > 1: # Note that I'm checking for > 1
return False
return True
# Driver code
if __name__ == "__main__":
print(is_unique("abcd"))
運行時,這會輸出True,這意味著字串只有唯一字符。print(is_unique("abcd")用沒有唯一字符的單詞更改為其他內容,例如print(is_unique("hello")獲取 False。
當我將它翻譯成 C 時,Xcode 終端顯示“(lldb)”,Xcode 編輯器打開一個檔案0_mh_execute_header,其內容如下:
dsa`_mh_execute_header:
0x100000000 < 0>: .long 0xfeedfacf ; unknown opcode
0x100000004 < 4>: .long 0x0100000c ; unknown opcode
0x100000008 < 8>: udf #0x0
0x10000000c < 12>: udf #0x2
0x100000010 < 16>: udf #0x12
0x100000014 < 20>: udf #0x638
0x100000018 < 24>: .long 0x00218085 ; unknown opcode
0x10000001c < 28>: udf #0x0
0x100000020 < 32>: udf #0x19
0x100000024 < 36>: udf #0x48
0x100000028 < 40>: .long 0x41505f5f ; unknown opcode
0x10000002c < 44>: saddwt z7.h, z10.h, z26.b
0x100000030 < 48>: udf #0x4f52
0x100000034 < 52>: udf #0x0
0x100000038 < 56>: udf #0x0
0x10000003c < 60>: udf #0x0
0x100000040 < 64>: udf #0x0
0x100000044 < 68>: udf #0x1
0x100000048 < 72>: udf #0x0
0x10000004c < 76>: udf #0x0
0x100000050 < 80>: udf #0x0
0x100000054 < 84>: udf #0x0
...
注意:...在上面意味著它繼續。Stack Overflow 僅允許正文中包含 30000 個字符,但這將超過 950000
在第 1 行,Xcode 顯示錯誤:Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001)在檔案的右側(就像出現編譯器問題時通常那樣)。
你知道如何解決這個問題嗎?
uj5u.com熱心網友回復:
問題出在這里:
int arr[] = {};
您正在創建的陣列具有0可以使用驗證
cout << "sizeof(arr): " << sizeof(arr) << endl;
的長度當您嘗試在此處訪問超出陣列大小的值時會發生錯誤:
arr[i] = 0;
您需要做的是指定陣列的大小,例如int arr[128];它創建了一個可以容納 128 秒的陣列int,它涵蓋了 7 位 ASCII 的范圍。或者使用一個向量,你可以改變它的大小。
我還要指出,它的邏輯是行不通的,你可能想要做的是
int isUnique(string str) {
// Create an array that holds 128 ints and initialize it to 0
int arr[128] = {0};
// First loop no longer needed
for (int i = 0; i < str.length(); i) {
// Increment count for cell that corresponds to the character
char c = str[i];
arr[c] = 1;
}
// Note that you can reuse variable name when previous one
// has fallen out of scope
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i) {
if (arr[i] > 1) {
return false;
}
}
return true;
}
我建議您閱讀有關 C 記憶體模型的更多資訊。
uj5u.com熱心網友回復:
問題出在這里:
int arr[] = {};
C 和 C 中的陣列不是動態的。您在那里創建的是一個包含 0 個元素的陣列,它將永遠如此。所以,當你這樣做時:
arr[i] = 0;
您正在將陣列的末尾寫入隨機記憶體。如果您希望陣列與字串的長度相同,則需要:
int arr[str.size()];
或者,使用向量:
std::vector arr(str.size());
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/438143.html
下一篇:如何使用SwiftUI顯示分數
