在c编程中使用指针
我对c编程中的指针有问题。我希望在Linux中从命令行获取变量,而不是从命令行将变量的值分配给非指针变量并打印出来 字符*argv[] 这是一个函数,它接受命令行中c程序名称之后写入的所有内容,并将其存储在指针*argv[]中;现在我想将这些指针值存储在一个普通变量中,并在命令行上打印出来。我在执行代码时遇到了分段错误在c编程中使用指针,c,pointers,C,Pointers,我对c编程中的指针有问题。我希望在Linux中从命令行获取变量,而不是从命令行将变量的值分配给非指针变量并打印出来 字符*argv[] 这是一个函数,它接受命令行中c程序名称之后写入的所有内容,并将其存储在指针*argv[]中;现在我想将这些指针值存储在一个普通变量中,并在命令行上打印出来。我在执行代码时遇到了分段错误 int main ( int argc, char *argv[] ) { char r1; char a = *argv[1]; char b = *
int main ( int argc, char *argv[] )
{
char r1;
char a = *argv[1];
char b = *argv[2];
char c = *argv[3];
if ( b == '+') {
r1 = a + c;
printf("%s", r1);
}
}
printf(“%s”,r1)
这就是你的错误的来源
%s
转换说明符要求其相应的参数具有类型char*
,并且是以零结尾的char
数组的第一个元素的地址r1
是将a
和c
中的值相加的结果,这将不是一个有效的地址
C不是Python或Javascript-值不会根据上下文在数字和字符串之间神奇地转换。如果要使用命令行中的数值,必须首先手动将这些值的字符串表示形式转换为相应的类型
例如,如果命令行是/foo1
,则argv[1]
包含字符串“1”
(表示为序列{1',0}
)。*argv[1]
的值不是1
,而是字符'1'
的编码值,假设ASCII为49
。您需要使用库函数,如atoi()
或strtol()
,将字符串“1”
转换为整数值1
假设您的输入是
./foo 1 + 2
如果要打印3
,则需要执行以下操作:
#include <stdlib.h>
#include <stdio.h>
int main( int argc, char **argv )
{
if ( argc < 4 )
{
fprintf( stderr, "USAGE: %s <val> <op> <val>\n", argv[0] );
return EXIT_FAILURE;
}
/**
* strtol() allows you to detect and reject non-numeric input,
* but I'm omitting that here for brevity.
*/
int lhs = (int) strtol( argv[1], NULL, 0 );
int rhs = (int) strtol( argv[3], NULL, 0 );
if ( *argv[2] == '+' )
{
int r1 = lhs + rhs;
printf( "%d\n", r1 );
}
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
char r1;
char *a = argv[1];
char b = argv[2][0];
char *c = argv[3];
if ( b == '+') {
r1 = atoi(a) + atoi(c);
printf("%d", r1);
}
}
#包括
#包括
int main(int argc,字符**argv)
{
如果(argc<4)
{
fprintf(stderr,“用法:%s\n”,argv[0]);
返回退出失败;
}
/**
*strtol()允许您检测和拒绝非数字输入,
*但为了简单起见,我省略了这一点。
*/
int lhs=(int)strtol(argv[1],NULL,0);
int-rhs=(int)strtol(argv[3],NULL,0);
如果(*argv[2]='+')
{
int r1=左侧+右侧;
printf(“%d\n”,r1);
}
返回退出成功;
}
要记住的事情:
在C语言中,字符串是包含零值终止符的字符值序列-字符串“Hello”
表示为序列{H',e',l',l',o',0}
。要使序列成为字符串,尾随的0是必需的
字符串存储在字符类型的数组中(char
用于ASCII、EBCDIC和UTF-8等编码,wchar\u t
用于UTF-16等“宽”编码)
除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化声明中字符数组的字符串文字,否则“T的N元素数组”类型的表达式将被转换(“衰减”)为“指向T
的指针”类型的表达式,表达式的值将是数组第一个元素的地址
printf(“%s”,r1)
这就是你的错误的来源
%s
转换说明符要求其相应的参数具有类型char*
,并且是以零结尾的char
数组的第一个元素的地址r1
是将a
和c
中的值相加的结果,这将不是一个有效的地址
C不是Python或Javascript-值不会根据上下文在数字和字符串之间神奇地转换。如果要使用命令行中的数值,必须首先手动将这些值的字符串表示形式转换为相应的类型
例如,如果命令行是/foo1
,则argv[1]
包含字符串“1”
(表示为序列{1',0}
)。*argv[1]
的值不是1
,而是字符'1'
的编码值,假设ASCII为49
。您需要使用库函数,如atoi()
或strtol()
,将字符串“1”
转换为整数值1
假设您的输入是
./foo 1 + 2
如果要打印3
,则需要执行以下操作:
#include <stdlib.h>
#include <stdio.h>
int main( int argc, char **argv )
{
if ( argc < 4 )
{
fprintf( stderr, "USAGE: %s <val> <op> <val>\n", argv[0] );
return EXIT_FAILURE;
}
/**
* strtol() allows you to detect and reject non-numeric input,
* but I'm omitting that here for brevity.
*/
int lhs = (int) strtol( argv[1], NULL, 0 );
int rhs = (int) strtol( argv[3], NULL, 0 );
if ( *argv[2] == '+' )
{
int r1 = lhs + rhs;
printf( "%d\n", r1 );
}
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
char r1;
char *a = argv[1];
char b = argv[2][0];
char *c = argv[3];
if ( b == '+') {
r1 = atoi(a) + atoi(c);
printf("%d", r1);
}
}
#包括
#包括
int main(int argc,字符**argv)
{
如果(argc<4)
{
fprintf(stderr,“用法:%s\n”,argv[0]);
返回退出失败;
}
/**
*strtol()允许您检测和拒绝非数字输入,
*但为了简单起见,我省略了这一点。
*/
int lhs=(int)strtol(argv[1],NULL,0);
int-rhs=(int)strtol(argv[3],NULL,0);
如果(*argv[2]='+')
{
int r1=左侧+右侧;
printf(“%d\n”,r1);
}
返回退出成功;
}
要记住的事情:
在C语言中,字符串是包含零值终止符的字符值序列-字符串“Hello”
表示为序列{H',e',l',l',o',0}
。要使序列成为字符串,尾随的0是必需的
字符串存储在字符类型的数组中(char
用于ASCII、EBCDIC和UTF-8等编码,wchar\u t
用于UTF-16等“宽”编码)
除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化声明中字符数组的字符串文字,否则“T的N元素数组”类型的表达式将被转换(“衰减”)为“指向T
的指针”类型的表达式,表达式的值将是addre