在C中完成while循环时,不能指定字符

时间:2017-01-20 23:24:57

标签: c arrays string

我试图找到解决方案如何在字符串的末尾添加'\ 0'(C中的字符数组)。 我已经有了从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 warning(disable:4996) //disables crt warnings
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include<string.h>

double stof(char s[]);

int main(){
    char string[] = "123.45e-10";
    stof(string);

}

double stof(char s[]) {
    bool isNegative = false;
    bool eFound = false;
    int i = 0;
    int j = 0;
    int k = 0;
    char number[10];
    char potention[11];
    int dotPosition;


while (s[i] != '\0') {
    if (isdigit(s[i]) && eFound == false) {
        number[j++] = s[i];
    }
    else if (s[i] == '.') {
        dotPosition = i;
    }
    else if (s[i] == 'e' || s[i] == 'E')
        eFound = true;

    else if (s[i] == '-')
        isNegative = true;

    else if (eFound== true && isdigit(s[i])){
        potention[k++] = s[i];
    }
        i++;
}

i = 0;
while (isdigit(number[i])){
    i++;
}
printf("%d", i);
number[i] = 'b';


const int charSize = dotPosition;
int potentionN = atoi(potention);


char beforeDecimal[sizeof(number)];
char addedNulls[20];
int g = 0;
if (isNegative == true) {
    strncpy(beforeDecimal, number, dotPosition);
    int addNull = potentionN - sizeof(beforeDecimal);
    printf("%d", addNull);
    while (g < addNull) {
        addedNulls[g] = '0';
        g++;
    }
    printf("%d", strlen(addedNulls));
}


return 0.0;
}

1 个答案:

答案 0 :(得分:0)

  

为什么在C中无法做到这一点?

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

在C中,确保您阅读和阅读非常重要。只写入已定义的内存:变量覆盖的位置。您正在使用

测试输入位置
while (s[i] != '\0')

但您无处可确保您保持在numberpotention的范围内。特别是在这里:

i = 0;
while (isdigit(number[i])){
    i++;
}

在任何时候你都不会向number写一个非数字。那个循环为什么要结束?

即时修复是初始化number

char number[10] = {};

这会导致编译器使用{}内的任何元素初始化数组,其余部分用零填充。由于初始化程序为空,因此整个数组都用零填充。

这样,如果你没有用数字填充number,那么你的while循环将会终止。腰带和吊带的解决方案是双重确定的:

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

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