アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムがなぜ正しく出力されないのかわからないです。
(課題)
コマンドライン引数で文字列(アルファベットの大文字または小文字)を受け取り連続している個数を数で表す。(例 aafwGGg → a2f1w1G2g)
(プログラム)
#include<stdio.h>
#include<string.h>

//arrでどの文字が何回連続になっているかを記録する。

int main(int argc, char *argv[]){
int i, j = 0, counter = 1; char *str;
//文字列のコピー
str = argv[1];
//配列arrの初期化:全て0の文字数分の要素数
char arr[(int)strlen(str)];
for(i = 0; i <= (int)strlen(str) - 1; ++i){
arr[i] = '0' + 0;
}
//どの文字が何回連続になっているかの測定
for(i = 0; i <= (int)strlen(str) - 1; ++i){
if(str[i] == str[i + 1]){
counter += 1;
}
if(i == (int)strlen(str) - 1){
arr[j] = str[(int)strlen(str) - 1];
//couterの数字を代入
if(counter >= 10){
arr[j + 1] = '0' + counter / 10;
arr[j + 2] = '0' + counter % 10;
j += 1;
}
else{
arr[j + 1] = '0' + counter;
}
}
if(str[i] != str[i + 1] && i != (int)strlen(str) - 1){
arr[j] = str[i];
//counterの数字を代入
if(counter >= 10){
arr[j + 1] = '0' + (counter / 10);
arr[j + 2] = '0' + (counter % 10);
j += 3;
}
else{
arr[j + 1] = '0' + counter;
j += 2;
}
counter = 1;
}
arr[j + 2] = '/';
}
for(i = 0; arr[i] != '/'; ++i){
printf("%c", arr[i]);
}
printf("\n");
return 0;
}

始めと終わり部分は正しいのですが、真ん中部分が誤った出力になってしまいます。
一定の範囲が常におかしいようです。
よろしくお願いします。

「c言語 プログラムのエラー」の質問画像

A 回答 (1件)

ロジックをきちんと見ていませんが


char arrのサイズが足りないかと思います。
入力サイズの2倍+アルファを確保しておく必要があるかと。
char arr[(int) strlen(str)*2 + 16];
にしてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

うまくいきました!
ありがとうございました。

お礼日時:2023/02/11 21:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!