C:使用凯撒密码加密符号输出,为什么? pset2 cs50

时间:2014-07-17 20:14:13

标签: c string c-strings cs50

这是Caesar的密码加密edx.org中cs50x课程的pset2中的问题。

我已经用另一种算法解决了这个问题,但这是我的第一次尝试,我仍然很好奇为什么所有这些符号出现在凯撒文本的右侧。

即。我输入文字“Testing”,输出为“Fqefuz�����w����l��B��”,但答案是正确的,没有符号。

任何人都可以解释一下吗?

int main(int argc, string argv[])
{
    bool keyOk = false;
    int k = 0;   
    do
    {
        if(argc != 2) // Checking if the key was correctly entered.
        {
            printf("You should enter the key in one argument from"
                " the prompt(i.e. './caesar <key>').\n");
            return 1;
        }
        else
        {
            k = atoi(argv[1]); // Converting string to int.
            keyOk = true; // Approving key.
        }
    }
    while(keyOk == false);

    string msg = GetString(); // Reading user input.
    char caesarMsg[strlen(msg)];

    for(int i=0, n = strlen(msg); i < n; i++)
    {

        if( (msg[i] >= 'a') && (msg[i] <= 'z') )
        // Processing lower case characters
        {
            caesarMsg[i] = ((((msg[i] - 97) + k) % 26) + 97);
        }
        else if( (msg[i] >= 'A') && (msg[i] <= 'Z') )
        // Processing upper case characters
        {
            caesarMsg[i] = ((((msg[i] - 65) + k) % 26) + 65);
        }
        else
        {
            caesarMsg[i] = msg[i];
        }

    }
    printf("%s", caesarMsg);
    printf("\n");        
}

1 个答案:

答案 0 :(得分:2)

根本问题是C 有一个完整,正确或一流的&#34;字符串&#34;数据类型。在C strings中实际上是以NUL'\0')(*)字符终止的字符数组。

看看

  string msg = GetString();  // Reading user input.
  char caesarMsg[strlen(msg)];

这相当于

  char* msg = GetString();  /* User or library function defined elsewhere */

/* calculates the length of the string s, excluding  the terminating null
   byte ('\0') */
  size_t len = strlen(msg);  

  char caesarMsg[len];  /* Create an character (byte) array of size `len` */

希望这更清楚,为什么这部分无法正常工作。我添加的变量len是字符串msg中非NUL字符序列的长度。因此,当您创建长度为caesarMsg的字符数组len时,无法存储NUL字符。

for循环正确执行,但printf("%s", caesarMsg);将继续打印字符,直到找到NUL或崩溃。

顺便说一下,您可以轻松地将最后的两个printf语句简化为单个printf语句。

printf("%s\n", caesarMsg); 

字符串和字符数组经常引起混淆,对于C新手来说,有些人对C来说并不那么新。其他一些参考文献:


Rant:创造string typedef的人是邪恶的/犯了严重的错误,误导学生认为C弦的字符串是真实的&#34; (或一等)数据类型。


(*)NULNULL不同,因为NULL(空指针)被转换为指针,因此它与其他指针的大小相同,其中为{ {1}}是一个空字符(大小为NULchar)。