【问题标题】:Convert argv[1] into an int and it's digits into an array将 argv[1] 转换为 int 并将其数字转换为数组
【发布时间】:2013-07-14 17:08:38
【问题描述】:

我一直在尝试用 C++ 创建一个程序来尝试完成这个伪代码:

get argv[1] into int

get int’s digits into array[int length]

for int i = array length; i >= 0;

gen random number into check

if check == array[i]
    i
    say Number i was check
end if

我认为我真正苦苦挣扎的部分是

get argv[1] into int

get int’s digits into array[int length]

部分。在我的完整代码中,甚至没有尝试,因为我尝试过的任何东西都不起作用。我得到最多的错误是代码编译,但每次它尝试cout << "Number 1:" << number 我只是得到Number 1: 0 无论我输入的实际数字。当0 == 0 代码甚至没有注意到时。

我破坏的可能违反约定的代码如下:

#include <iostream>
#include <string>

int main (int argc, char **argv) {

    if (argc == 1 || argc == 3) {
        std::cout << "Argument count does not match (one argument expected)\n";
        return(-1);
    }

    std::cout << "Input: " << argv[1] << "\n";

    const char* text = argv[1];
    int number = atoi(text);

        int check = rand() % 10;

        std::cout << "Check 1: " << check << "\nNumber 1: " <<  number << "\n";

        if (check == array[i]) {
            i++;
            std::cout << "Success! Number " << i << " was " << check << ".\n";
        }
    }
}

TL;DR:我的“某种”数字破解者不想将 argv1 放入 int 中,然后将 int 的数字放入数组中。

随意让我感到愚蠢。希望问题不要太具体。我会按要求详细说明。

编辑:这是早期的转换尝试:

    int array[];
    for (int i = strlen(text); i >= 0; i--) {
        array[i] = number % 10;
        number /= 10;
    }

EDIT2:这么多回复,没有解决方案。谢谢你试图一次解释这个新手这么多事情。顺便说一句:Git

【问题讨论】:

  • text 中的每个字符都是数字的 ASCII 表示,对吧?您可以利用这一点将每个数字放入您的 int 数组中,而不是先使用 atoi
  • @crush 除了我对 c++ 几乎一无所知,也不知道如何去做你所暗示的事情。虽然我有点明白你在说什么。
  • 第一件事是停止将char 视为alphatbetic character。它实际上只是一个 8 位字节。您的输入来自控制台,除非您使用一些经过修改的使用 unicode 的特殊控制台,否则它将始终是 ASCII。如果您不熟悉 ASCII,请查看以下 ASCII 表:asciitable.com。注意每个character 都有一个对应的数值。例如,数字0实际上是数字48。此外,C++中的字符串通常以NUL字节结束,其值为0。
  • 假设您的用户输入了数字“576”。这是一个 char 的数组,它是一个 4 个字节的数组:char arr[4] = {53, 55, 54, 0}; 最后一个字节是字符串终止符,是检查字符串结尾的内容。
  • @crush 耶,我学到了新东西!

标签: c++ arrays int argv


【解决方案1】:

前面的尝试几乎是好的:只是你必须为数组实际分配空间,像这样:

int array[strlen(text)];

如果您的编译器支持可变长度数组作为扩展,并且

std::vector<int> array;
array.resize(strlen(text));

如果您想坚持使用标准 C++ 并遵循一些好的做法。

但是,如果你想变得棘手,你甚至不需要将参数转换为数字:

if (argv[1][i] == check % 10 + '0')

也可以。总而言之,完整的程序应该是这样的:

#include <iostream>
#include <cstdlib>


int main(int argc, char *argv[])
{
    int check = std::rand();
    std::cout << check << std::endl;

    char *p = argv[1] + strlen(argv[1]);
    while (p - argv[1] >= 0) {
        if (*--p == '0' + check % 10)
            std::cout << "guessed " << p - argv[1] << "th digit" << std::endl;

        check /= 10;
    }

    return 0;
}

【讨论】:

  • 我绝对是 C++ 的新手,所以请原谅我的愚蠢:我应该把这些东西放在代码中的什么位置?您的修复可能是正确的,但目前在 for (int i= strlen... 之上添加它只会给我以前遇到的相同错误。我在 mac 的终端上使用 g++。
  • @jontturi 哪些东西?这个答案有三个代码sn-ps。
  • 我在你写最后一个 sn-p 之前加载了这个页面。我说的是前两位。
  • @jontturi 您将int array[]; 替换为其中任何一个。但无论如何,请参阅编辑 - 您过于复杂了。
  • 嗯,正在编译您的编辑,我收到了:$ ./a.out 7 16807 guessed 0th digit
【解决方案2】:

您的代码比较接近正确。您正在为数组的声明而苦苦挣扎(您必须为其指定大小)。 32位int不能超过十位,所以声明

int array[10];

应该足够了。

在将数字转换为数字数组之前,检查它是否为负数,如果为负数则翻转其符号:

if (number < 0) {
    number = -number;
}

否则,您的 number%10 技巧将不起作用。

当你进行转换时,数一数你有多少位数。将结果放入actualCount 变量中:您可能不会用完数组中的所有数字,所以

int check = rand() % 10; // 10 is the max, not the actual digit count

应该是

int check = rand() % actualCount;

您的参数检查也需要改进:想想如果用户传递五个参数会发生什么?如果你只期望一个参数,你应该写

if (argc != 2) {
    std::cout << "Argument count does not match (one argument expected)\n";
    return(-1);
}

【讨论】:

  • 一个很好的答案,但是当您在需要分配之前知道 strlen 时,无需指定最大大小的数组。 =}
  • @crush 除了 10 个 ints 不会浪费内存,标准 C++ 不支持 VLA。
  • @crush strlen 就足够了,但它可能无法为您提供确切的位数(再次考虑负数 ;-) 按照今天的标准,十个字节是一个很小的数字,所以使用 @ 987654332@ 和 delete[] 获得确切的字节数不太可能为您节省任何东西,尤其是在存储指针需要八个字节的架构中:-)
  • 好的,我目前有这个:pastebin.com/LsDRZhB9,我得到的唯一错误是(我将数组重命名为 arr)“在 'arr' 中对成员 'size' 的请求,这是非-class 类型'int [10]'"
  • @jontturi C++ 数组没有 size() 函数 - 您可以在声明中将大小硬编码为 10,在声明和循环中使用 #define NUM_DIGITS 10,或使用数组大小宏#define SIZE(arr) ((sizeof(arr)/sizeof(arr[0])))
【解决方案3】:

要一次只从一个数字中提取一个数字,您有多种选择。

为方便起见,您可以使用std::string,将原始字符串(argv[1])插入其中,然后一次提取一个char

#include <string>

...    

// put the input in a string
std::string text = argv[1];

for (unsigned i = 0; i < text.size(); i++)
{
   // extract only one char, a digit
   char ch = text.at(i);
   // convert that char in a number
   int n = ::atoi(& ch);

   // use n
   ...
}

如果你不想使用std::string,你总是可以使用类似c的数组(argv[1]本身):

#include <cstring>

...    

for (unsigned i = 0; i < strlen(argv[1]); i++)
{
   // extract only one char, a digit
   char digit = argv[1][i];
   // convert that char in a number
   int num = ::atoi(& digit);

   // use n
   ...
}

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2016-01-22
    相关资源
    最近更新 更多