Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c编程中使用指针_C_Pointers - Fatal编程技术网

在c编程中使用指针

在c编程中使用指针,c,pointers,C,Pointers,我对c编程中的指针有问题。我希望在Linux中从命令行获取变量,而不是从命令行将变量的值分配给非指针变量并打印出来 字符*argv[] 这是一个函数,它接受命令行中c程序名称之后写入的所有内容,并将其存储在指针*argv[]中;现在我想将这些指针值存储在一个普通变量中,并在命令行上打印出来。我在执行代码时遇到了分段错误 int main ( int argc, char *argv[] ) { char r1; char a = *argv[1]; char b = *

我对c编程中的指针有问题。我希望在Linux中从命令行获取变量,而不是从命令行将变量的值分配给非指针变量并打印出来

字符*argv[]

这是一个函数,它接受命令行中c程序名称之后写入的所有内容,并将其存储在指针*argv[]中;现在我想将这些指针值存储在一个普通变量中,并在命令行上打印出来。我在执行代码时遇到了分段错误

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