您好,我正在開發一個凱撒加密程式。現在它將帶有要加密的訊息的檔案作為輸入,密鑰
輸入當前采用以下格式:
“文本.txt”,“ccc”
我需要將其轉換為一個數字,以便它符合我的要求,所以是這樣的:
“文本.txt”,“3”
然后我需要將這個“3”轉換回“ccc”,這樣程式仍然可以作業。邏輯是 3 轉換為字母“c”的第三個字母,并重復 3 次。另一個例子是如果輸入的鍵是“2”,它應該回傳“bb”。
這是我到目前為止所擁有的,但它給了我很多警告并且該功能無法正常作業。
#include <stdio.h>
void number_to_alphabet_string(int n) {
char buffer[n];
char *str;
str = malloc(256);
char arr[8];
for(int i = 0; i < n; i ) {
buffer[i] = n 64;
//check ASCII table the difference is fixed to 64
arr[i] = buffer[i];
strcat(str, arr);
}
printf(str);
}
int main(int argc, char *argv[]) {
const char *pt_path = argv[1]; //text.txt
char *key = argv[2]; //3
number_to_alphabet_string((int)key); //should change '3' to 'CCC'
}
uj5u.com熱心網友回復:
你的問題是你有一個功能
void number_to_alphabet_string(int n)
這需要一個 int 但你用 char* 呼叫它
char* key = argv[2]; //3
number_to_alphabet_string(key);
我的編譯器說
1>C:\work\ConsoleApplication3\ConsoleApplication3.cpp(47,34): 警告 C4047: 'function': 'int' 與 'char *' 的間接級別不同
你需要
char* key = argv[2]; //3
number_to_alphabet_string(atoi(key));
將該字串轉換為數字
uj5u.com熱心網友回復:
使用char *key = argv[2];,強制(int) key轉換不會將該字串的內容重新解釋為有效整數。該強制轉換所做的是獲取 的指標值,并將其key解釋為整數。其結果是實作定義的,或者如果結果不能以整數型別表示則未定義(如果 可能的結果)。sizeof (int) < sizeof (char *)
C 標準沒有為這些值定義任何含義。
這是一個測驗程式,根據您的平臺,它應該讓您了解正在發生的事情(或未發生的事情)
#include <stdio.h>
int main(int argc, char **argv) {
if (sizeof (long long) >= sizeof (char *))
printf("Address %p as an integer: %lld (%llx)\n",
(void *) argv[0],
(long long) argv[0],
(long long) argv[0]);
}
作為實作定義的行為的一個例子,在我的系統上,這會列印出類似
Address 0x7ffee6ffdb70 as an integer: 140732773948272 (7ffee6ffdb70)
在我的系統上,將相同的指標值轉換為(int)導致未定義的行為。
請注意,intptr_tanduintptr_t是將指標值視為整數的正確型別,但這些型別是可選的。
要將字串實際轉換為整數,可以使用atoi、strtol或等函式sscanf。這些中的每一個都有其優點和缺點,以及處理/報告錯誤輸入的不同方式。
沒有錯誤處理的例子:
int three = atoi("3");
long four = strtol("4", NULL, 10);
long long five;
sscanf("5", "%lld", &five);
number_to_alphabet_string有一些問題。
malloc可以失敗,回歸NULL。你應該準備好處理這個事件。
如果事件malloc成功,它的記憶體內容是不確定的。這意味著您需要在將記憶體傳遞給類似的函式之前初始化(至少部分)記憶體,該函式strcat需要一個正確的空終止字串。照原樣,strcat(str, arr);將導致未定義的行為。
此外,分配的記憶體malloc應該在使用完畢后釋放free,否則會造成記憶體泄漏。
char *foo = malloc(32);
if (foo) {
foo[0] = '\0';
strcat(foo, "bar");
puts(foo);
free(foo);
}
一般來說,strcat額外的緩沖區是不必要的。特別是使用char arr[8];是不安全的,因為如果足夠大,arr[i] = buffer[i];可以很容易地越界訪問陣列。n
此外, in strcat(str, arr);,arr也永遠不會以空值結尾(更多UB)。
另請注意,這printf(str);通常是不安全的。如果str包含格式說明符,當沒有提供匹配的引數時,您將再次呼叫未定義的行為。使用printf("%s", str),或者也許puts(str)。
據我所知,您只需要將整數值轉換為如果A=1, B=2, ...n則將與之關聯的大寫字符并重復多次。n
首先,不需要任何型別的緩沖區。
void number_to_alphabet_string(int n) {
if (1 > n || n > 26)
return;
for (int i = 0; i < n; i )
putchar('A' n - 1);
putchar('\n');
}
當通過時5,這將列印EEEEE。
如果要創建字串,請確保終止字符有一個附加位元組,并且已設定。calloc可用于在分配期間清零緩沖區,有效地終止它。
void number_to_alphabet_string(int n) {
if (1 > n || n > 26)
return;
char *str = calloc(n 1, 1);
if (str) {
for (int i = 0; i < n; i )
str[i] = 'A' n - 1;
puts(str);
free(str);
}
}
請注意,實際上并不需要動態記憶體。char str[27] = { 0 };足以作為函式持續時間的緩沖區。
粗略main地了解其中的任何一個:
#include <stdio.h>
#include <stdlib.h>
void number_to_alphabet_string(int n);
int main(int argc, char *argv[]) {
if (argc > 1)
number_to_alphabet_string(atoi(argv[1]));
}
請注意,對于無效字串,atoi只需回傳0,這與有效字串無法區分"0"- 有時是不利的行為。
uj5u.com熱心網友回復:
- 您不能使用強制轉換從 char 陣列強制轉換為 int,您必須使用函式,例如
atoi(). - 分配 str 后,您永遠不會釋放它。
free(str)當您不再需要它時,您應該使用它。否則,它會導致記憶體泄漏,這意味著你 malloc() 的記憶體將一直被占用,直到你的行程死亡。C沒有垃圾收集,所以你必須自己做。 - 不寫之類的
char buffer[n];,可以通過GCC的編譯,但是在MSVC中不行。這不是宣告可變長度陣列的標準方法。采用
char* buffer = malloc(n);
//don't forget to free() in order to avoid a memory leak
free(buffer);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465497.html
上一篇:如何顯式型別轉換指標
