C 将数值变量视为文本
我不知道如何命名这个问题,所以我将直接转到代码,让您了解我的意思。真的很新,所以请容忍我 我有以下代码:C 将数值变量视为文本,c,command-line,cs50,C,Command Line,Cs50,我不知道如何命名这个问题,所以我将直接转到代码,让您了解我的意思。真的很新,所以请容忍我 我有以下代码: 1 #include <cs50.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 int main(int argc, string argv[]) 6 { 7 8 if (argc!=2) 9 { 10 printf("error!! Usage: ./caesar
1 #include <cs50.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 int main(int argc, string argv[])
6 {
7
8 if (argc!=2)
9 {
10 printf("error!! Usage: ./caesar k\n");
11 return 1;
12 }
13
14 printf("Plaintext: ");
15 string text=get_string();
16
17 char k=argv[1][0];
18 int n=strlen(text);
19
20
21 for (int i=0; i<n; i++)
22 {
23 if(text[i]>='a' && text[i]<='z')
24 {
25 printf("Cyphertext: %c\n", text[i]+k);
26 }
27 }
28 }
第三个,鉴于上述错误,我更改了第25行中的代码:
printf("Cyphertext: %c\n", text[i]+k);
为此:
printf("Cyphertext: %s\n", text[i]+k);
返回此错误消息的:
caesar.c:25:38: error: format specifies type 'char *' but the argument has
type 'int' [-Werror,-Wformat]
printf("Cyphertext: %s", text[i]+k);
~~ ^~~~~~~~~
%d`
错误消息我不明白,因为text
和k
都不是int
无论如何,将%c
更改为%s
无效,因此我尝试使用%I
:
printf("Cyphertext: %i\n", text[i]+k)
它至少返回了一些东西:
$./caesar 1
Plaintext: a
Cyphertext: 146
$./caesar 5
Plaintext: a
Cyphertext: 150
因此,基本上,它是将k
添加到150-这在ASCII中是“ā”,所以…(?)
最后,除了程序返回一个我不理解的数字之外,我想我可以让它以字母/非数字字符的形式显示,添加以下内容:
printf("Cyphertext: %i\n", (char)text[i]+k);
但它实际上没有,程序返回与上面显示的最后一个输出完全相同的结果
好吧,这是一个比我预期的要长得多的问题,但我希望在座的有人有能力回答这个问题
非常感谢如果您只想将一个数字(
'0'
-'9'
)转换为一个数字,您只需从输入中减去'0'
的Ascii码即可
char digit;
int num = digit - '0';
您应该首先检查输入是否在范围内
if (digit < '0' || '9' < digit)
// error!!
if(数字<'0'| |'9'<数字)
//错误!!
如果您只想将一个数字('0'
-'9'
)转换为一个数字,只需从输入中减去'0'
的Ascii码即可
char digit;
int num = digit - '0';
您应该首先检查输入是否在范围内
if (digit < '0' || '9' < digit)
// error!!
if(数字<'0'| |'9'<数字)
//错误!!
命令行参数始终作为字符串传入。仅仅因为程序希望第一个参数看起来像一个数字,并不一定意味着传递了一个数字
因此,当您通过argv[1][0]
获取字符串中的第一个字符时,您不会获取值1,而是获取字符。假设ASCII用于字符,则此字符的ASCII值为49。因此,在本例中,k
的值为49
您需要将参数转换为数字。您可以为此使用atoi
功能:
int k = atoi(argv[1]);
命令行参数始终作为字符串传入。仅仅因为程序希望第一个参数看起来像一个数字,并不一定意味着传递了一个数字 因此,当您通过
argv[1][0]
获取字符串中的第一个字符时,您不会获取值1,而是获取字符。假设ASCII用于字符,则此字符的ASCII值为49。因此,在本例中,k
的值为49
您需要将参数转换为数字。您可以为此使用atoi
功能:
int k = atoi(argv[1]);
通用解决方案是
int k = atoi(argv[1]);
atoi接受字符串并将其转换为数字。上面的减法解决方案只处理单个数字,这将允许k>9通用解决方案是
int k = atoi(argv[1]);
atoi接受字符串并将其转换为数字。上面的减法解决方案只处理单个数字,这将允许您在代码的第15行声明一个字符串类型的变量。字符串不是本机C类型。您确定要用C编码吗?请使用模数运算符%将“加密”值保持在范围内。“text[i]+k%26”(当然也可以使用atoi()或strtol()或类似工具将命令行arg转换为整数)@woz,他正在用C编写cs50定义和库。我把它称为“C语言编码”的一种特殊变体,但是YMMV。添加了[cs50]标记。
if(text[i]>='a'&&text[i]在代码的第15行声明了一个字符串类型的变量。字符串不是本机C类型。您确定要用C编码吗?请使用模数运算符%将“加密”值保持在范围内。“text[i]+k%26”(当然,还可以使用atoi()或strtol()或者类似于将命令行arg转换为整数)@woz,他使用cs50定义和库在C中编码。我会称之为“C中编码”的具体变体,但YMMV.添加了[cs50]标记。if(text[I]>='a'&&text[I]