CS50撒我怎么atoi?

CS50 Caesar how do I atoi?

我进入 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");
    }

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

解释:我们考虑ASCII码中的单个字符,它是0到255之间的数字。'0''1'...'9'coincidentally/intentionally按照它们的相同顺序排列价值。在这种情况下,我们通过减去 '0'

的 ASCII 码得到数字字符的值

我建议使用循环来检查字符串的每个数字,然后使用对 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

#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;
    }
}

`