CS50凯撒我怎么听?

时间:2020-11-01 03:29:39

标签: c cs50 caesar-cipher

我已经进入CS50了3周,花了整整一天的时间让atoi上班。编译以下代码时出现以下错误。

我的问题是:

  1. 如何在atoi()函数中表示每个字符?
  2. 如何仅将结果打印一次? (循环将我将atoi更改为argv [1]时打印出argv的次数)

非常感谢社区。我渴望成为一名优秀的程序员。

========== caesar.c:22:30:错误:指针转换不兼容的整数,将'char'传递给'const char *'类型的参数;拿 地址为&[-Werror,-Wint-conversion] int a = atoi(argv [1] [i]); ^ ~~~~~~~~~

int main(int argc, string argv[])
{
    //if not exactly 1 argument, print error message a value of 1
    if (argc == 2)
    {
        for (int i = 0; i < strlen(argv[1]); i++)
        {
            if (!isdigit(argv[1][i]))
            {
                printf("Usage: ./caesar key\n");
                return 1;
            }
            else
            {
                int a = atoi(argv[1][i]);
                printf("%i\n",a);
            }
        }
    }
    else
    {
        printf("Usage: ./caesar key\n");
    }

3 个答案:

答案 0 :(得分:0)

简单使用int a = argv[1][i] - '0'

说明:我们考虑ASCII码中的单个字符,它是介于0到255之间的数字。“ 0”,“ 1” ...“ 9”按其值的相同顺序偶然/有意地排列。在这种情况下,我们通过减去ASCII数字“ 0”来获得数字字符的值

答案 1 :(得分:0)

我建议使用循环检查字符串的每个数字,然后使用一次调用atoi将字符串转换为数字:

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

int main(int argc, char *argv[])
  {
  //if not exactly 1 argument, print error message a value of 1

  if (argc == 2)
    {
    for (int i = 0; i < strlen(argv[1]); i++)
      {
      if (!isdigit(argv[1][i]))
        {
        printf("Usage: ./caesar key\n");
        return 1;
        }
      }

    int a = atoi(argv[1]);
    printf("%i\n", a);
    }
  else
    printf("Usage: ./caesar key\n");
  }

Example at onlinegdb here

答案 2 :(得分:0)

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

bool check_valid (string s)
{
     for (int i = 0; i < strlen(s); i++)
     {
         if (isalpha(s[i]))
            return false;
     }
     return true;
}

int main (int argc, string argv[])
{
    if (argc != 2 || !check_valid(argv[1]))
    {
       printf("Usage: ./caesar key\n");
       return 1;
    }
}

`