C++ 非常奇怪的C行为

C++ 非常奇怪的C行为,c++,c,C++,C,嗨,在下面的简单程序中发生了一些非常奇怪的事情。该程序采用2位ASCII数字,因为我只需要读取数字、“@”符号和“.”符号。并找出此字节的ASCII符号 int main(int args, char* argv[]) { unsigned int ch; char aux[256]; strcpy(aux,argv[1]); char a[0]; char buff[50]; char result[512]; int i=0; while(i lessThan st

嗨,在下面的简单程序中发生了一些非常奇怪的事情。该程序采用2位ASCII数字,因为我只需要读取数字、“@”符号和“.”符号。并找出此字节的ASCII符号

int main(int args, char* argv[])
{
 unsigned int ch;


char aux[256];

 strcpy(aux,argv[1]);

 char a[0];

 char buff[50];
 char result[512];
 int i=0;

 while(i lessThan strlen(argv[1]))
 {   
     a[0]=aux[i];
     a[1]=aux[i+1];
     a[2]='\0';
     ch = atoi(a);
      printf("el int:%d \n",ch);
      sprintf(buff,"%c",ch);

       printf("el char: %s \n", buff);
       i=i+2;
   }

 } 
好的,这正在工作,在变量buff中,以正确的方式打印所有ASCII符号。但正如你所看到的,我有一个名为result的
char[]
,从未使用过。所以我删除了它。当我再次运行程序时,我得到了一个不同的结果:O。出于某种原因,程序不再读取“.”字符:(为什么???请有人解释我害怕lol

我的结果与变量结果声明:

 ./try3 494650526450

    el int:49

    el char: 1 

    el int:46 

    el char: . 

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 
 ./try3 494650526450

    el int:49 

    el char: 1 

    el int:0 

    el char:  

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 
我的结果不带变量结果声明:

 ./try3 494650526450

    el int:49

    el char: 1 

    el int:46 

    el char: . 

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 
 ./try3 494650526450

    el int:49 

    el char: 1 

    el int:0 

    el char:  

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 

您正在使用一个GNU扩展名。将
char a[0];
更改为
char a[3];
。声明另一个未使用的char数组会更改内存布局,这就是它看起来“正常”的原因。

您使用了一个零长度数组
char a[0]
并访问最多三个元素。因此,您需要获得至少3个分配的位置
char a[3]


输出的可能原因是,当您访问
a[1]
或更多时,堆栈上
结果的分配与
a
数组相邻,它将访问
a
的边界之外(因为长度为0),并实际插入到其他数组的内存位置。在该位置写入将损坏该位置的数据。

直接错误是使用空数组:
char a[0]
声明一个没有元素的数组(C++中非法的东西;我在C中不好,但我认为在C上下文中也禁止它)。这个数组需要至少3个元素宽。 除此之外,这个节目充满了问题。我发现了:

  • 它显然缺少标题
  • 在访问第一个参数之前,不会检查传递的参数数
  • strcpy()
    到数组时,不考虑第一个参数的长度(这应该是
    strncpy()
  • 如前所述,
    chara[0];
    声明一个空数组
  • lessThan
    不是C或C的一部分++
  • i
    是有符号整数,而
    strlen()
    返回无符号整数,混合符号比较通常是个坏主意(尽管在这种情况下它们不会产生问题)
  • 在每个迭代器中确定字符串长度的速度很慢
  • 打印到字符串时,通常需要使用
    snprintf()
    (尽管在这种情况下,数组不会被覆盖)

为什么要声明零长度数组?(
char a[0];
)。什么是
lessThan
?什么是“while(i lessThan strlen(argv[1])”lessThan操作符?事实上,你很奇怪,不是C…我必须这样做,因为参数argv[1]被保存在char a[2]中,但当我这样做时,我没有代码a[2]='\0'!现在我从a[0]到a[3]使用[2]='\0',并且正在运行perfec!:)thx家伙