我试图找到解决方案如何在字符串的末尾添加'\ 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;
}
答案 0 :(得分:0)
为什么在C中无法做到这一点?
每个可计算的答案都可以使用图灵完备语言找到。您的问题更像是,我的代码中的错误在哪里?
在C中,确保您阅读和阅读非常重要。只写入已定义的内存:变量覆盖的位置。您正在使用
测试输入位置while (s[i] != '\0')
但您无处可确保您保持在number
和potention
的范围内。特别是在这里:
i = 0;
while (isdigit(number[i])){
i++;
}
在任何时候你都不会向number
写一个非数字。那个循环为什么要结束?
即时修复是初始化number
:
char number[10] = {};
这会导致编译器使用{}
内的任何元素初始化数组,其余部分用零填充。由于初始化程序为空,因此整个数组都用零填充。
这样,如果你没有用数字填充number
,那么你的while循环将会终止。腰带和吊带的解决方案是双重确定的:
i = 0;
while (i < sizeof(number) && isdigit(number[i])) {
i++;
}
我没有调试你的整个程序;我甚至没有编译它。您看到的运行时错误表明您正在写入未定义的内存。如果检查每个循环中的数组边界,则可以避免该特定问题并转到下一个问题。 ;-)