回答編集履歴

2

getc 版追加

2022/11/23 07:25

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -138,3 +138,48 @@
138
138
  add: 9999999999
139
139
  multi: 1219326311126352690
140
140
  ```
141
+ ---
142
+ scanf で無く getc でちゃんと(?)制限無しにするなら
143
+ ```c
144
+ /** file から(数字で無い文字をスキップ後、数字で無い文字が現れるまでの)数字列を読み込み、桁毎を NODE としたリストを返す */
145
+ NODE *create_list_from_file(FILE *file) {
146
+ NODE *head = create_node(NULL, 0);
147
+ for(int c; (c=getc(file)) != EOF; ) {
148
+ if(c < '0' || '9' < c) {
149
+ if(head->next == head) continue;
150
+ break;
151
+ }
152
+ create_node(head->prev, c-'0');
153
+ }
154
+ if(head->next == head && feof(file)) return NULL; //何も無いまま EOF は許さない
155
+ return normalize_list(head);
156
+ }
157
+ ```
158
+ を追加して main を
159
+ ```c
160
+ //char buf[2][1024]; //不要
161
+
162
+ int main(int argc, char *argv[]) {
163
+ NODE *list1 = create_list_from_file(stdin);
164
+ if(list1 == NULL) { fprintf(stderr, "error: list1 が見つからない."); return -1; }
165
+ NODE *list2 = create_list_from_file(stdin);
166
+ if(list2 == NULL) { fprintf(stderr, "error: list2 が見つからない."); return -1; }
167
+
168
+ print_list(list1, "list1: ");
169
+ print_list(list2, "list2: ");
170
+
171
+ NODE *add = addition_list(list1, list2);
172
+ print_list(add, "add: ");
173
+ free_list(add);
174
+
175
+ NODE *multi = multiplication_list(list1, list2);
176
+ print_list(multi, "multi: ");
177
+ free_list(multi);
178
+
179
+ free_list(list1);
180
+ free_list(list2);
181
+
182
+ return 0;
183
+ }
184
+ ```
185
+ とすれば同じ結果になります。

1

追記

2022/11/22 10:42

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -1,3 +1,4 @@
1
+ scanf の時点で長さに制限がかかってしまうので、 getc 使えみたいな条件があるのかもしれませんが。
1
2
  ```c
2
3
  #include <stdio.h>
3
4
  #include <stdlib.h>