[問題] C語言初學觀念請益

作者: how0919 (joke)   2021-11-06 00:30:15
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
<stdlib.h>
問題(Question):
將使用者輸入字串轉為指定大小的矩陣
(EX. 1.0,2.0;3.0,4.0; 則存為2*2矩陣
1,2,3;4,5,6; 則存為2*3矩陣)
餵入的資料(Input):
1.0,2.0;3.0,4.0;
預期的正確結果(Expected Output):
1.0 2.0
3.0 4.0
錯誤結果(Wrong Output):

程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[1000] = {0} , m[10][10][10] = {0};
float M[10][10] = {0},constant = 0;
int column=0, row=0, element=0, counter1 = 0, counter2 = 0,counter3 = 0;
gets(input);
for ( int i = 0; i < sizeof(input); i++)
{
if (input[i] == ';')
{
counter1++;
counter2 = 0;
counter3 = 0;
element++;
continue;
}
else if (input[i] == ',')
{
counter2++;
counter3 = 0;
element++;
continue;
}
m[counter1][counter2][counter3]=input[i];
counter3++;
}
column = counter1;
row = element / column;
for (int i = 0; i < column; i++)
{
for (int j = 0; j < row; j++)
{
M[i][j] = atof(m[i][j]);
}
}
for (int i = 0; i < column; i++)
{
for (int j = 0; j < column ; j++)
{
if (j == 0)
{
printf("\n%.1f\t", M[i][j]);
}
else
{
printf("%.1f\t", M[i][j]);
}
}
}
return 0;
}
補充說明(Supplement):
菜雞我第一個碰的程式是PYTHON
在寫PYTHON的時候 很習慣用string跟array的觀點去看題目
最近學C學了一個月
還是很習慣硬用array去解題
前幾天碰到輸入兩矩陣相乘
發現光是輸入2個矩陣就花了快50行
雖然輸出結果是對的
但是感覺作法很笨 好像太依賴PYTHON string split的概念
想問一下寫C是不是應該用跟PYTHON不同的觀點切入解題
順便問一下我的寫法應該怎麼改善
(還不是很習慣指標的用法 不知道這題能不能用指標寫)
附上我看到這題第一時間想到的圖
https://imgur.com/a/6ioxHsb
(第一次在這個版發文 不知道排版會不會跑掉
如果跑掉了 這是我傳到github上的 https://reurl.cc/ARpNZe)
作者: firejox (Tangent)   2021-11-06 01:01:00
用 sscanf 切或者用 strtok 切都行像這樣 https://gcc.godbolt.org/z/GP3szPMY8
作者: how0919 (joke)   2021-11-06 09:40:00
感謝f大 多學到一招了
作者: stupid0319 (徵女友)   2021-11-06 12:53:00
scanf很雷,有些開源都禁止使用
作者: how0919 (joke)   2021-11-06 14:06:00
剛開始寫都用gets 後來老師說會有記憶體越界的問題 才改用scanf 的
作者: stupid0319 (徵女友)   2021-11-06 14:14:00
作者: firejox (Tangent)   2021-11-06 19:07:00
scanf 只要了解運作跟缺點其實還可以用
作者: ManOfSteel (Man Of Steel)   2021-11-06 19:10:00
參考cppreference的網站,會比較知道scanf的性質https://i.imgur.com/O6E57Kp.jpg手邊剛好有筆記QQ
作者: how0919 (joke)   2021-11-06 20:02:00
感謝各位大大
作者: b0920075 (Void)   2021-11-07 20:57:00
scanf 沒弄好也有越界問題XD 沒有格式化字串的需求看你要不要用 fgets
作者: Schottky (順風相送)   2021-11-07 21:50:00
推薦用 fgets 取代 gets

Links booklink

Contact Us: admin [ a t ] ucptt.com