将数值变量视为文本

时间:2017-07-06 17:21:36

标签: 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 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。这意味着,对于abck=1,输出将为bcd;对于abck=3,输出为def

现在,必须将k作为命令行参数给出。

我想做什么? 只需取k(这是一个数字),将其添加到输入string text的每个字符,然后vo。 由于每个字母都是ASCII中的数字,因此添加数字可以更改字符,因此......它应该可以正常工作。 [我仍在试图弄清楚ASCII是如何工作的,什么时候char显示为字符而不是数字......但无论如何都是如此。

发生了什么事? 首先,我无法将k声明为intchar。在第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`

错误消息我不明白,因为textk都不是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);

但实际上没有,程序返回与上面显示的完全相同的最后一个输出。

很好,这是一个比我预期的问题长得多的问题,但我希望这里有人能够回答它的专长和熟练程度。

非常感谢!

2 个答案:

答案 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