【问题标题】:Whats wrong with my simple encryption in C? (cs50 pset 2 - crypt)我在 C 中的简单加密有什么问题? (cs50 pset 2 - 地穴)
【发布时间】:2013-08-03 01:15:25
【问题描述】:

我不太明白这些错误是从哪里来的。我正在尝试创建一个简单的 C 程序,它接受一个字符串并向 ASCII 值添加一个偏移量,以创建一个极其简单的加密。

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>

char obscufate_char(char origchar, int offset){
    if(strcmp(origchar, " ") != 0){
        int temp = origchar;
        char newChar = temp + 4;
        return newChar;
    }
    else{
        return 20;
    }
} 

int main(int argc, string argv[]){

    if(argv[1] != NULL){
        string message = argv[1];
    }else{
        printf("%s\n", "Enter a string to encrypt\n");
        string message = GetString();
    }

    if(argv[2] != NULL){
        int offset = atoi(argv[2]);
    }else{
        printf("%s\n", "Enter a offset\n");
        int offset = GetInt();
    }

    printf("%s%s\n", "Your original text is: ", message);
    printf("%s\n", "Your new message is: ");
    for(int i = 0; i < strlen(message); i++){
        printf("%c\n", obscufate_char(message[i]),offset);
    }

    return 0;
}
simple_crypt.c:7:12: error: incompatible integer to pointer conversion passing
      'char' to parameter of type 'const char *'; take the address with &
      [-Werror]
        if(strcmp(origchar, " ") != 0){
                  ^~~~~~~~
                  &
/usr/include/string.h:143:34: note: passing argument to parameter '__s1' here
extern int strcmp (__const char *__s1, __const char *__s2)
                                 ^
simple_crypt.c:20:10: error: unused variable 'message'
      [-Werror,-Wunused-variable]
                string message = argv[1];
                       ^
simple_crypt.c:23:10: error: unused variable 'message'
      [-Werror,-Wunused-variable]
                string message = GetString();
                       ^
simple_crypt.c:27:7: error: unused variable 'offset' [-Werror,-Wunused-variable]
                int offset = atoi(argv[2]);
                    ^
simple_crypt.c:30:7: error: unused variable 'offset' [-Werror,-Wunused-variable]
                int offset = GetInt();
                    ^
simple_crypt.c:33:46: error: use of undeclared identifier 'message'
        printf("%s%s\n", "Your original text is: ", message);
                                                    ^
simple_crypt.c:35:28: error: use of undeclared identifier 'message'
        for(int i = 0; i < strlen(message); i++){
                                  ^
simple_crypt.c:36:33: error: use of undeclared identifier 'message'
                printf("%c\n", obscufate_char(message[i]),offset);

【问题讨论】:

  • 你的意思是你不明白为什么会出现这些错误?因为编译器会准确地告诉你它们来自哪里,而且它会告诉你它认为什么是错误的
  • 我不知道错误来自哪里似乎使用了所有变量
  • 两个提示:第一个错误是无效类型,所以找出“指针和引用”,其他错误是因为您使用了超出其范围的变量,请参阅“c中的变量范围规则”。当我有更多时间来提供更完整的答案时,我会尝试回来......
  • 你拼错了“混淆”。

标签: c cs50


【解决方案1】:
simple_crypt.c:7:12: error: incompatible integer to pointer conversion passing
      'char' to parameter of type 'const char *'; take the address with &
      [-Werror]
        if(strcmp(origchar, " ") != 0){

当函数需要一个字符 * 时,您正在传递一个字符。 origchar 不是 char *。

simple_crypt.c:20:10: error: unused variable 'message'
      [-Werror,-Wunused-variable]
                string message = argv[1];

我假设 cs50.h 为您提供了一个“字符串”类型。您正在 if 语句中进行初始化,并且您希望在 if 语句的范围之外看到它,这不会发生。 if 语句外部的 message 与内部的 message 不同。里面的消息只是被声明和初始化,但没有做任何事情,本质上使它在其范围内未被使用。对于编译器来说,if 语句之外的消息是一个未声明的变量。

您应该首先在 if 语句之外声明 message,以便编译器知道消息正在并将在 main 的范围内创建,或者至少在 if 语句的范围之外可以看到。您可以在 if 语句中为其赋值,但如果您希望在 if 语句之外看到它,则不应在 if 语句中声明它。 if 语句有自己的作用域,因此在它完成后,您初始化的 message 将消失,无需对其进行任何操作。

offset 和其余的 message 错误相同。

【讨论】:

    【解决方案2】:
    printf("%c\n", obscufate_char(message[i]),offset);
    

    您没有正确关闭括号。你的函数有两个参数。

    printf("%c\n", obscufate_char(message[i],offset));
    

    【讨论】:

      【解决方案3】:

      首先,您的main 中有语法错误:

      printf("%c\n", obscufate_char(message[i]),offset);

      应该是,否则你的整个 obscufate_char() 会失败

      printf("%c\n", obscufate_char(message[i], offset));

      其次,您应该在“if”之外声明messageoffset,最好是在main 的开头。 因为在if 中声明在它之外不起作用,所以在for 循环中声明i 也是如此。

      【讨论】:

        【解决方案4】:

        if 语句之前声明您的变量,然后在if 分支中为它们赋值。

        string message; 
        if() 
        {
           message = Whatever;
        } 
        else 
        {
           message = SomethingElse;
        };
        

        如果第 19 行的第一个 if(argv[1] != NULL) 条件不满足,则在第 20 行声明的message 变量不使用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-20
          • 1970-01-01
          相关资源
          最近更新 更多