該当コード(一部抜粋)
関数に渡された文字列に空白やマイナス、プラス記号があった場合左にずらしてこれらの記号を消したいのですがバスエラーがでてしまいうまく動作しません。どこが原因なのでしょうか?
※2連続で記号が来た場合jを初期化しないとダメですがそこは一回保留で1つだけ記号がある場合を考えてます
c
1 char str[] = "-1234" //example 2 i = 0; 3 j = 0; 4 while (str[i] == '-' || str[i] == '+' || str[i] == ' ') // check minus plus sings 5 { 6 while (digit > 1) //digitはstrの桁数 7 { 8 str[j] = str[j + 1]; 9 j++; 10 digit--; 11 } //2連続で記号が来た場合jを初期化しないとダメですがそこは一回保留で1つだけ記号がある場合を考えてます 12 i++; 13 }
dititを求める関数
c
1int ft_len(char *base) //to check base 2{ 3 int len; 4 5 len = 0; 6 while (base[len] != '\0') 7 len++; 8 return (len); 9}
該当コード全て
c
1#include <stdio.h> 2int base_check(char *base) 3{ 4 int i; 5 int j; 6 7 i = 0; 8 j = i + 1; 9 while (base[i] == '\0') 10 { 11 if (base[i] == '+' || base[i] == '-') 12 return (0); 13 while (base[j] != '\0') 14 { 15 if (base[i] == base[j]) 16 return (0); 17 j++; 18 } 19 i++; 20 } 21 return (1); 22} 23 24int ft_atoi_base(char *str, char *base) 25{ 26 int num[256]; 27 int base_s; 28 int sum; 29 int minus; 30 int i; 31 int j; 32 33 i = 0; 34 j = 0; 35 minus = 1; 36 if (!(base_check(base))) 37 return (0); 38 while (str[j] == '-' || str[j] == '+' || str[j] == ' ') 39 { 40 if (str[j] == '-') 41 minus *= -1; 42 j++; 43 } 44 while ((str[i++] = str[j++]) != '\0'); 45 printf("%s ", str); 46 47 return (0); 48} 49 50int main(void) 51{ 52 int num; 53 num = ft_atoi_base("-1234", "0123456789"); // A798BF(16) → 10983615(10) 54 printf("%d", num); 55 return 0; 56} 57
digitが初期化されてないようですね。
あとstrの終端'\0'以降にアクセスしないようなコードにしないといけないような気もします。
「digitはstrの桁数」を割り出すコードはどのように書いていますか?
digit = ft_len(str)で値は入っている状態です
コード追加しました
wsl2上のubuntuでgcc 9.3.0でビルドした限りでは、少なくともご提示のコードで落ちることはありませんでした。
エラーを起こしてしまうのはどういった環境で動作させていますでしょうか。
あ、すみません、自分が知らないだけかもしれませんが、ft_lenってなんでしょう
MacOS
Unix環境です
自分は今Mac触れる環境にないのでこれ以上はお役に立てなさそうです。ごめんなさい。
ちなみに終端文字の処理が気になる所ではありますが、落ちないです。
(動作させると12344が出力されます)
ご自身でこの質問のコードを実行して問題が再現しますか?
再現できたら再現に使ったコードを貼ってください。
現状ではコピペで実行できるようになっていないので色々付け加えないとならず、
回答者側で問題を再現させるのが難しくなっています。
回答3件
あなたの回答
tips
プレビュー