我撰寫了一個程式,允許我將 26 個 alpha 字符的命令引數用作程式后期加密文本的密鑰。
為此,我必須 (a) 驗證用戶輸入的 alpha 字符 (b) 字符是 26 并且 (c) 它們都不重復。
我決定把這一切都放在一個函式中(如下所示)。這已經成功了。
else if但是,當我嘗試使用一個條件檢查密鑰是否確實是 26 個字符(在我的主函式中)時,else if (argc != 2 || (is_valid_key(argv[1]) != 1 || is_valid_key(argv[2]) == 2))我認為(is_valid_key(argv[1]) != 1這里可能沒用,因為我在if.
當我這樣做時(不管我的命令引數如何),我的程式回傳了分段錯誤(核心轉儲),我試圖了解原因。
導致問題的行在else if我的主要功能中。
對于背景關系:
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int is_valid_key(string verify);
int main(int argc, string argv[])
{
//check whether the user input a valid comand line arguement
if (argc != 2 || is_valid_key(argv[1]) == 1)
{
printf("Usage: ./substitution key\n"); //re-prompt user if they didn't enter a digit
return 1;
}
else if (argc != 2 || is_valid_key(argv[2]) == 2))
{
printf("Key must only contain alphabetic characters.\n");
return 1;
}
string plain_text = get_string("plaintext: ");
printf("%s\n", plain_text);
}
int is_valid_key(string verify)
{
int i;
for (i = 0; i < verify[i]; i )
{
char ch = verify[i];
if (!isalpha(ch))
{
return 1; //return for alpha
}
}
if (i != 26)
{
return 2; //return for 26 chars
}
for (int a = 0; verify[a] != '\0'; a )
{
for (int b = 0; b < a; b )
{
// if 2 characters match, the key is not valid
if (verify[a] == verify[b])
return 3; // return for no repeate
}
}
return 4; //return all correct
}
uj5u.com熱心網友回復:
代碼沒有檢查main().
它正在測驗is_valid_key(argv[2]),但在您的測驗用例中只有一個命令列引數:
# ./main qwertyuiopasdfghjklzxcvbnm
只有:
argv[0]它指向字串“./main”(或任何你的可執行檔案被呼叫)argv[1]指向字串“qwertyuiopasdfghjklzxcvbnm”
被參考的argv[2]不存在,并且參考“結束” argv,因此是段錯誤。
將此行更改為:
else if (argc >= 2 || is_valid_key(argv[1]) == 2) // <<-- HERE
{
printf("Key must only contain alphabetic characters.\n");
return 1;
}
會修復它。
uj5u.com熱心網友回復:
分段錯誤意味著您正在嘗試訪問您不應該擁有的記憶體位置。引數的索引從 0 開始。并且該程式中應該只有 2 個命令列引數。因此,您正在嘗試訪問當前超出范圍的索引 2。因此,您的程式退出時說“分段錯誤”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/516690.html
標籤:Ccs50
