2017-01-20 3 views
-2

文字列の最後に '\ 0'を追加する方法を解明しようとしています。 私は既にforループから生成された配列 "number"を持っています。は、whileループがC言語で実行されたときに文字を割り当てることができません

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ではできませんか?

EDIT(全体のコードが追加された):

#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; 
} 
+2

「数値」とは何ですか?なぜ重要な情報を差し控えますか? –

+2

このコードはコンパイルされません。 'number'や' eFound'の宣言はなく、 'asserts'もありません。あなたは[最小限の、完全で、かつ証明可能な例を作ることができますか?](http://stackoverflow.com/help/mcve)? – giusti

+0

私は数年間でCを書いていません。その文字列を割り当てるだけの正当なchar []宣言ですか? –

答えて

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++; 
} 

私はプログラム全体をデバッグしていません。私もそれを編集していない。表示されているランタイムエラーは、未定義のメモリに書き込むことを示唆しています。各ループで配列境界をチェックすると、その特定の問題を回避して次の問題に進むことができます。 ;-)

関連する問題