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