我不知道如何标题这个问题,所以我会直接找代码让你看看我的意思。真的很新,所以忍受我吧!
我有这段代码:
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 }
它的目的是什么?
好吧,给定一个文本,它会为每个角色添加k
。这意味着,对于abc
和k=1
,输出将为bcd
;对于abc
和k=3
,输出为def
。
现在,必须将k
作为命令行参数给出。
我想做什么?
只需取k
(这是一个数字),将其添加到输入string text
的每个字符,然后vo。
由于每个字母都是ASCII中的数字,因此添加数字可以更改字符,因此......它应该可以正常工作。 [我仍在试图弄清楚ASCII是如何工作的,什么时候char
显示为字符而不是数字......但无论如何都是如此。
发生了什么事?
首先,我无法将k
声明为int
或char
。在第17行, - 尽管k
是一个数字(!) - IDE强制我声明一个字符串或char *:如果我将k
声明为int
我收到错误;如果我声明char
我也会收到错误,除非我将其声明为k=argv[1]
而是k=argv[1][0]
,如上面的代码所示。
第二次,执行上面的代码,这是输入 /输出(程序的名称是caesar):
$./caesar
error!! Usage: ./caesar k
$./caesar 1
Plaintext: a
Cyphertext: (nothing...)
第三次,鉴于上述错误,我更改了第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
所以,基本上,它是在ASCII中添加k
到150,这是'û',所以......(?)。
最后,除了程序返回一个我不理解的数字之外,我想我可以让它显示为字母/非数字字符添加:
printf("Cyphertext: %i\n", (char)text[i]+k);
但实际上没有,程序返回与上面显示的完全相同的最后一个输出。
很好,这是一个比我预期的问题长得多的问题,但我希望这里有人能够回答它的专长和熟练程度。
非常感谢!
答案 0 :(得分:2)
如果您只想将数字('0'
- '9'
)转换为数字,则只需从输入中减去'0'
的Ascii代码即可。
char digit;
int num = digit - '0';
您应首先检查输入是否在范围内。
if (digit < '0' || '9' < digit)
// error!!
答案 1 :(得分:2)
通用解决方案是
int k = atoi(argv[1]);
atoi接受一个字符串并将其转换为数字。上面的减法解决方案仅处理单个数字,这将允许k> 1。 9