can';在C中完成while循环时不指定字符

can';在C中完成while循环时不指定字符,c,arrays,string,C,Arrays,String,我正在试图找到如何在字符串(C中的字符数组)末尾添加“\0”的解决方案。 我已经有了从for循环生成的数组“number” int i=0; int j=0; char s[] = "123.45e-10"; while (s[i] != '\0') { if (isdigit(s[i]) && eFound == false) { number[j++] = s[i]; } i++ } 我试着这样做: i = 0; while (isd

我正在试图找到如何在字符串(C中的字符数组)末尾添加“\0”的解决方案。 我已经有了从for循环生成的数组“number”

int i=0;
int j=0;
char s[] = "123.45e-10";
while (s[i] != '\0') {
    if (isdigit(s[i]) && eFound == false) {
        number[j++] = s[i];
    }
    i++
}
我试着这样做:

i = 0;
while (isdigit(number[i])){
    i++;
}
printf("%d", i);
number[i] = 'b';
我没有编译错误,但在运行visual studio程序时

“调试断言失败”

为什么这在C语言中是不可能的

编辑(添加整个代码):

#pragma警告(disable:4996)//禁用crt警告
#包括
#包括
#包括
#包括
双stof(chars[]);
int main(){
字符字符串[]=“123.45e-10”;
斯托夫(弦);
}
双stof(字符s[]{
bool为阴性=假;
bool-eFound=false;
int i=0;
int j=0;
int k=0;
字符数[10];
焦电位[11];
整型点位;
而(s[i]!='\0'){
if(isdigit(s[i])&&eFound==false){
数字[j++]=s[i];
}
如果(s[i]='.'),则为else{
dotPosition=i;
}
如果(s[i]=“e”| s[i]=“e”)
eFound=true;
如果(s[i]=='-'),则为else
isNegative=true;
else如果(eFound==true&&isdigit(s[i])){
电位[k++]=s[i];
}
i++;
}
i=0;
while(isdigit(编号[i])){
i++;
}
printf(“%d”,i);
编号[i]=“b”;
常量int charSize=dotPosition;
int-potensionn=atoi(电位);
十进制之前的字符[sizeof(数字)];
char-addedNulls[20];
int g=0;
如果(isNegative==true){
strncpy(十进制、数字、点位置之前);
int addNull=potensionn-sizeof(十进制之前);
printf(“%d”,addNull);
while(g
为什么这在C语言中是不可能的

每个可计算的答案都可以用图灵完备语言找到。你的问题更像是,我的代码中的错误在哪里

在C语言中,确保只对定义的内存(变量所覆盖的位置)进行读写是非常重要的。您正在使用

while (s[i] != '\0')
但是你没有任何地方能保证你在
number
potential
的范围内。特别是在这里:

i = 0;
while (isdigit(number[i])){
    i++;
}
在任何情况下,您都不能将非数字写入
数字。为什么循环会结束

即时修复方法是初始化
编号

char number[10] = {};
这会导致编译器使用
{}
中的任何元素初始化数组,其余元素则使用零。因为初始值设定项是空的,所以整个数组用零填充

这样,如果您不使用数字填充
number
,您的while循环将终止。皮带和吊带解决方案可确保:

i = 0;
while (i < sizeof(number) && isdigit(number[i])) {
    i++;
}
i=0;
而(i

我还没有调试你的整个程序;我甚至还没有编译它。您看到的运行时错误表明您正在写入未定义的内存。如果检查每个循环中的数组边界,则可以避免该特定问题并继续下一个问题。;-)

什么是编号?为什么要保留关键信息?此代码无法编译。没有
编号
的声明,也没有
断言
。你能吗?我已经好几年没写C了。这是一个合法的char[]声明吗?我已经添加了完整的代码,很抱歉误解了字符串
number
不是以第一个循环结尾的null。这可能很重要。
i = 0;
while (i < sizeof(number) && isdigit(number[i])) {
    i++;
}