我有一段代码如下所示
#include <stdio.h>
#include <stdlib.h>
void Advance_String(char [2],int );
int Atoi_val;
int Count_22;
int Is_Milestone(char [2],int P2);
char String[2] = "0";
main()
{
while(1)
{
if(Is_Milestone(String,21)==1)
{
if(atoi(String)==22)
{
Count_22 = Count_22 + 1;
}
}
Atoi_val = atoi(String);
Advance_String(S,Atoi_val);
}
}
int Is_Milestone(char P1[2],int P2)
{
int BoolInit;
char *Ptr = P1;
int value = atoi(Ptr);
BoolInit = (value > P2);
return BoolInit;
}
void Advance_String(char P1[2],int Value)
{
if(Value!=7)
{
P1[1] = P1[1]+1;
}
else
{
P1[1] = '0';
P1[0] = P1[0]+1 ;
}
}
现在我的问题是Count_22从不递增,因为char增量永远不会达到21或更高的值。有人可以告诉我这种意外行为的原因吗?我的问题是找到Count_22的值。是否有任何问题代码?
谢谢和问候,
麦迪
答案 0 :(得分:3)
您的代码可能是我见过的最糟糕的C代码之一(没有冒犯,每个人都必须在某个时候学习)。
它有语法错误(可能是复制/粘贴问题),逻辑问题,无意义的混淆,不良实践(全局),缓冲区溢出(在没有存储终止零字节的地方的char上使用的atoi),未初始化的值(Count_22),令人惊讶的命名约定(混合的CamelCase和下划线,以大写字母开头的变量和函数),无限循环,没有标题,我忘了一些。
更多,如果您希望任何人帮助您调试此代码,您应该在列表中说明它应该做什么...
回答原来的问题:为什么Count_22永远不会增加?
因为Is_Milestone总是假的(有或没有@Jay更改)。 Is_Milestone打算似乎是将字符串“22”的十进制值与整数21(或1,布尔结果21 == 1)进行比较,具体取决于版本。)
由于Advance_String行为,这是合乎逻辑的。因为String具有错误的初始值(应该是char String[3] = "00";
)并且因为Value!= 7测试。我想你想要的是将数字与7进行比较,但atoi使用完整的字符串。在循环体中实现Atoi_val = atoi(String+1);
的另一个小改动。然后你再也看不到因为循环从不停止而且从不打印任何东西。
如果是第一次尝试某位老师给出的练习(例如“编写基础7中的两位数计数器”或类似的话)。您应该考虑不使用atoi并使用以下内容将字符数字转换为值:
digit_value = char_value - '0';
示例:
char seven_as_char = '7';
int seven_as_int = seven_as_char - '0';
如果你能解释一下你真正想做的事情,我们可能会向你展示一些简单的示例代码,而不是你想要调试的恐怖。
修改强>
使用原始代码真的更简单......
在阅读了Ada源代码后,我可以确认它确实是一个基于Ascii的八进制计数器。原始代码质量很差,这解释了生成的C代码质量差的部分原因。
一个可能的直接端口可能如下(但仍然需要一个严重的清理看起来像本机C代码......并且因为它打印一个常量而且非常愚蠢):
#include <stdio.h>
#include <stdlib.h>
void Advance_String(char * P1)
{
if((P1[1]-'0') != 7){
P1[1]++;
}
else{
P1[1] = '0';
P1[0]++ ;
}
}
int Is_Milestone(char * P1, int P2)
{
return (atoi(P1) > P2);
}
main()
{
int Count_11 = 0;
int Count_22 = 0;
int Count_33 = 0;
int Count_44 = 0;
char S[3] = "00";
int cont = 1;
while(cont)
{
if(Is_Milestone(S, 10)){
if(atoi(S) == 11){
Count_11 = Count_11 + 1;
}
if(Is_Milestone(S, 21)){
if(atoi(S) == 22){
Count_22 = Count_22 + 1;
}
if(Is_Milestone(S, 32)){
if(atoi(S) == 33){
Count_33 = Count_33 + 1;
}
if(Is_Milestone(S, 43)){
if(atoi(S) == 44){
Count_44 = Count_44 + 1;
}
if (atoi(S) == 77){
cont = 0;
}
}
}
}
}
Advance_String(S);
}
printf("result = %d\n", Count_11 + Count_22 + Count_33 + Count_44);
}
答案 1 :(得分:2)
本声明
if(Is_Milestone(S,21==1) // Braces are not matching. If statement is not having the closing brace. Compilation error should be given.
应该是
if(Is_Milestone(S,21)==1)
我想。
此外,您发布的代码似乎不正确。它肯定会给出编译错误。您已声明Count22
,但正在使用Count_22
。
请检查。