C++ 使用atoi将*argv[]转换为int

C++ 使用atoi将*argv[]转换为int,c++,C++,我试图使用atoi函数I将argv数组中存储的字符转换为int 对于C++和传递参数是新的,所以请容忍我。 每次我试图将存储在atoi[1]中的值设置为常量字符,并打印该字符时,它根本不会打印任何内容。如果我做错了,它仍然应该打印一个内存地址,对吗 我将其设置为常量字符,因为atoi函数需要常量字符作为其参数。(如果我错了,请纠正我) 我一直通过ideone.com这样做,所以我的argv数组并没有真正在运行时设置,因为ideone不允许这样做 以下是我目前的代码: #include <i

我试图使用atoi函数I将argv数组中存储的字符转换为int 对于C++和传递参数是新的,所以请容忍我。 每次我试图将存储在atoi[1]中的值设置为常量字符,并打印该字符时,它根本不会打印任何内容。如果我做错了,它仍然应该打印一个内存地址,对吗

我将其设置为常量字符,因为atoi函数需要常量字符作为其参数。(如果我错了,请纠正我)

我一直通过ideone.com这样做,所以我的argv数组并没有真正在运行时设置,因为ideone不允许这样做

以下是我目前的代码:

#include <iostream>
#include<string>
#include <stdlib.h>
using namespace std;

int main() {
    int argc;
    char *argv[4]; 

    *argv[0] = 'x';
    *argv[1] = '5';//this will be the length of our first array for testing
    *argv[2] = '3';//this will be the length of our second array for testing
    *argv[3] = '4';//this will be the length of our third array for testing
    argc = 4;

    const char  * argv1 = argv[1];

    cout << "*argv[1]: " <<  *argv[1] << endl;
    cout << "argv[1]: " <<  argv[1] << endl;
    cout << *argv1;

    //int x = atoi(argv1);

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
int-argc;
char*argv[4];
*argv[0]='x';
*argv[1]=“5”;//这将是我们要测试的第一个数组的长度
*argv[2]=“3”;//这将是用于测试的第二个数组的长度
*argv[3]=“4”;//这将是第三个用于测试的数组的长度
argc=4;
常量字符*argv1=argv[1];

cout通常,要将
std::string
转换为整数类型,可以使用。

当您写入指向未分配内存的指针时,代码会显示未定义的行为;请使用
std::string[]
或标准的
std::string
s容器。

您的指针都没有指向有效内存。当您遵从它们时,您会得到未定义的行为。即使这不是真的,也不会以null终止它们,因此它们不是字符串

改为:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main() {
    int argc;
    const char * argv[5]; 

    argv[0] = "x";
    argv[1] = "5";
    argv[2] = "3";
    argv[3] = "4";
    argv[4] = nullptr;
    argc = 4;

    int x = atoi(argv[1]);

    cout << "argv[1]: " <<  argv[1] << endl;
    cout << "x: " << x << endl;

    return 0;
}
同:

*(argv[0]) = 'x';
argv[0][0] = 'x';
这与:

*(argv[0]) = 'x';
argv[0][0] = 'x';
这意味着“将存储在
argv[0]
的地址存储在那里,并将值
'x'
存储在那里”。由于您从未初始化
argv[0]
,或您的任何
argv
成员,因此这些地址都无效,并且极不可能指向允许写入的任何内存

如果您将
argv
声明为,比如说,
char argv[4][20];
,那么这就可以了,因为
argv[0]
不再是一个未初始化的指针,而是一个可以写入的20个字符的数组

然而,即使你这样做了,你也会想做一些事情,比如:

argv[1][0] = 'x';
argv[1][1] = '\0';
因为传递给
atoi()
的内容必须是实际的(C样式)字符串,而不是指向单个字符的指针,并且字符串必须以空字符结尾

相反,在我给出的代码中:

const char * argv[5];
argv[1] = "5";  //  <-- Note use of double, not single, quotes
const char*argv[5];

argv[1]=“5”;//主要问题是没有分配数组元素指向的内存以及要写入字符的位置

有效的代码可以如下所示

#include <iostream>

int main() 
{
    const size_t N = 4;
    int argc;
    char *argv[N];

    argv[0] = new char( 'x' );
    argv[1] = new char( '5' );//this will be the length of our first array for testing
    argv[2] = new char( '3' );//this will be the length of our second array for testing
    argv[3] = new char( '4' );//this will be the length of our third array for testing
    argc = N;

    const char *argv1 = argv[1];

    std::cout << "*argv[1]: " << *argv[1] << std::endl;
    std::cout << "argv[1]: "  << ( void * )argv[1]  << std::endl;
    std::cout << *argv1 << std::endl;;

    for ( char *p : argv ) delete p;

    return 0;
}
考虑到在语句中使用casting to
void*

    std::cout << "argv[1]: "  << ( void * )argv[1]  << std::endl;

<代码> STD::CUT可能的副本我不是使用C++ 11,因此是C++标签,而不是C++ 11标签。谢谢,这非常有帮助。所以,当我通过命令行传递参数时,我的ARGV数组中的最后一个参数是空PTR,它是一个空指针,正确的?-是的,我正在编译G++和CurnLyTy,它不使用C++ 1。1.谢谢,这很有趣。所以argv在意义上类似于c字符串,因为它是一个字符数组数组,由指向空值的指针终止。所以argv总是2D?我以为2D数组是这样声明的**arrayName。如果我破坏了这一点,我真的很抱歉……我真的试图用argv来结束我的脑袋。事情可能会变得更糟在这种情况下,当您开始讨论指针和数组之间的技术差异时,会有点滑头。从技术上讲,
argv
是指向
char*
的单个指针,而不是数组,但对于大多数实际用途,您可以将其视为带有
argc+1的
char*
的一维数组e> 元素,最后一个元素总是
NULL
。从其最后一个可用元素作为信号“end of”的哨兵值的意义上讲,它类似于C字符串,是的。因为
argv
的每个元素指向一个C字符串,在大多数实际情况下,它也可以被视为一维数组(关于
char
,而不是
char*
)这允许您执行类似
argv[1][3]
的操作,使
argv
看起来像是一个二维数组,但实际上不是。
argv[1][3]='x';
基本上等同于
char*str=argv[1];str[3]='x';
    std::cout << "argv[1]: "  << ( void * )argv[1]  << std::endl;