学校でC言語の基礎学んだから見て

1以下、名無しにかわりましてVIPがお送りします:2025/03/18(火) 17:08:49.58 ID:DbdPNFS7

#include <stdio.h>
#include <stdlib.h>

int main() {

char* input = malloc(sizeof(char));
if (input == NULL){
perror("ERROR: input memory allocation failed.");
exit(EXIT_FAILURE);
}

int ch = 0;

int i = 0;

printf("Please give an integer: ");

while ((ch = getchar()) != EOF && ch != '\n'){
input = realloc(input, (size_t)(i+1) * sizeof(char));
if (input == NULL){
perror("ERROR: input memory allocation failed.");
exit(EXIT_FAILURE);
}
if (ch < 48 || ch > 57){
free(input);
fprintf(stderr, "ERROR: Please give a valid integer.\n");
exit(EXIT_FAILURE);
}
input[i] = ch;
i++;
}

input[i] = '\0';

printf("Given integer is: %s\n", input);

free(input);

return 0;
}
 

2以下、名無しにかわりましてVIPがお送りします:2025/03/18(火) 19:52:32.22 ID:XifXQL7b

配列の長さが1足りてないからNULL文字入れるとこでバッファオーバーフローしてる
それ以外はよく書けてると思う
ちゃんと細かいエラーハンドリングとfree忘れないの偉い

3以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 04:41:16.85 ID:nRXlqHx7

ちゃんとputs使ってね

4以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 05:05:13.18 ID:jSpTcRvx

パッと見putsに置き換えられそうな所無くない?
どこのことを言ってるんだろう

5以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 11:46:17.92 ID:4AaLhb1R

よくこんなん手打ちしていられるなぁと感心するばかり
絶対どこかでタイプミスする自信ある

6以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 12:18:39.35 ID:uv5UVgOT

>>5
タイプミスはエラー出るからわかるんだ
とにかく書いて後から手直しするだけだからそんなに神経使うものではないんだ

7以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 16:55:51.89 ID:6lVwJhxO

>>4
"Please give an integer:\n"でいいだろ
というか自動メモリを確保してる場合じゃないしそれ以前の問題だけど
楽しければ言うほど悪くないか

どんどん書いて

8以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 17:22:29.96 ID:4sKLEiwE

Cなんもわからんからこれが何をしてるのか教えて

9以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 18:05:56.38 ID:jSpTcRvx

>>7
そこ改行入れたくないんじゃない?
入力待ちでカーソルが次の行に来ちゃうのはCLIアプリとして変だと思う

10以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 18:25:37.40 ID:jSpTcRvx

メモリ確保については確かに改善できるね
入力された整数をintやlongに突っ込む前提で桁数決め打っておいて上限超えたらエラー吐くようにしてもいいし、桁数に上限設けたくないならバッファサイズを倍々にしていくやつでメモリ確保の計算量をO(N^2)からO(N)に落とすのが普通かな
どっちもいいプログラミングの練習になると思う

11以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 20:35:19.92 ID:4sKLEiwE

Cなんもわからんからこれが何をしてるのか教えて

12以下、名無しにかわりましてVIPがお送りします:2025/03/23(日) 20:57:40.05 ID:6lVwJhxO

>>9
fputs("Please give an integer: ", stdout);

>>11
This is a pen.的なプログラムだ

13以下、名無しにかわりましてVIPがお送りします:2025/03/24(月) 01:11:51.68 ID:ijl5xFu4

>>12
それprintfと等価だけど置き換える意味あるの?


レスを書き込む