Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数值变量视为文本_C_Command Line_Cs50 - Fatal编程技术网

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]