[英]=CS50 PSET 2 CAESAR= How do I convert the key to digit? It gives me this error if I use atoi()
我在only_digits
function 中遇到atoi()
的问题。我在 discord 上询问,他们说我正在将 char 类型的 arg 传递给atoi()
,因为atoi()
只接受字符串或 char * ( char 数组)为 arguments。我不明白。 我对字符串和字符的区别感到困惑。 我不是将argv[1]
(这是一个字符串)传递给only_digits
吗? 这意味着inputKey
也是一个字符串? 那么我将 char 类型的 arg 传递给atoi()
是什么意思? 我究竟如何使atoi()
工作? 我现在被这个问题困扰了 2 天。
// Encrypts text using Caesar's cipher
// ci = (pi + k) % 26
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
bool only_digits (string inputKey);
char rotate (char plaintext[], int key);
int main(int argc, string argv[])
{
string p;
// Make sure program was run with just one command-line argument
if (argc != 2)
{
printf("Enter exactly one input\n");
return 1;
}
// Make sure every character in argv[1] is a digit (DOESN'T WORK)
/*else if (only_digits(argv[1]))
{
printf("Usage: ./caesar key\n");
return 1;
}*/
else
{
p = get_string("plaintext: ");
}
// Convert argv[1] from a string to an int
int k = atoi(argv[1]);
char c[strlen(p) + 1];
// Convert ASCII range down to a value from 0 to 25
// For each character in the plaintext: (DOESN'T WORK)
for (int i = 0, n = strlen(p); i <= n; i++)
{
// Rotate the character if it's a letter // ci = (pi + k) % 26
if (isalpha(p[i]))
{
if (isupper(p[i]))
{
c[i] = ((p[i]) + k) % 26;
}
else if (islower(p[i]))
{
c[i] = ((p[i]) + k) % 26;
}
}
}
printf("ciphertext: %s\n", c);
}
// Function to encrypt plaintext
/*char rotate (char plaintext[], int key)
{
char c[strlen(plaintext) + 1];
return c;
}*/
// Function to check if key is a digit (DOESN'T WORK)
bool only_digits (string inputKey)
{
int flag = 0;
for (int i = 0, n = strlen(inputKey); i < n; i++)
{
// Converts string input to int
int response = atoi(inputKey[i]);
// Check if it is a digit
if (!(isdigit(response)))
{
flag++;
}
}
if (flag != 0)
{
return false;
}
else
{
return true;
}
}
C 中的字符串定义为一系列非零字节(字符),后跟一个空终止字节:
char str[] = "hello"; /* in memory: { 'h', 'e', 'l', 'l', 'o', '\0' } */
atoi
( ASCII 到 integer )需要一个正确的以 null 结尾的字符串( char *
)。 您不能将单个char
传递给它。
int number = atoi("1672387");
isdigit
需要一个字符。
int is_true = isdigit('5');
在您的程序inputKey[i]
是单个字符。 您可以直接使用isdigit
对其进行测试,无需事先将其转换为 integer 表示形式。
如果遇到非数字字符,您也可以提前返回。
bool only_digits(string inputKey) {
for (size_t i = 0, length = strlen(inputKey); i < length; i++)
if (!isdigit(inputKey[i]))
return false;
return true;
}
注意: size_t
是strlen
的返回类型,最适合索引 memory 的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.