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