[問題] 指標&memcpy的問題

看板C_and_CPP作者 (CS1DADA)時間13年前 (2011/05/18 17:30), 編輯推噓0(0069)
留言69則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) codeblock 問題(Question): 希望把fscanf抓出來的string拆成caracter存到一個struct中 但是當我用memcpy把抓出來的string拆成caracter後卻無法存入struct中 餵入的資料(Input): TEST.txt內容 None DRSH 預期的正確結果(Expected Output): 1 D R S H 錯誤結果(Wrong Output): 改完後是過了編譯但是 印來的是???? ,不是D R S H ,= = 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #define column 4 #define row 4 int colorL,colorD,formS,formR,tallT,tallS,insideS,insideH; int i,j; char board[20]; char myString1[20]; char myString2[20]; char myString3[20]; char myString4[20]; int counter; int row1,column1; struct ELEMENT { int active; char color; char form; char tall; char inside; }; typedef struct ELEMENT TEST; TEST array[row][column]; int main() { printf("TEST array_state\n"); FILE *cfPtr; if ((cfPtr=fopen("TEST.txt","r"))==NULL){ printf("file could not opened\n"); else{ row1=column1=0; fscanf(cfPtr,"%s",board); fscanf(cfPtr,"%s",board); String_to_caracter(board); fclose(cfPtr); } } int String_to_caracter(const char * const sPtr){ array[0][0].active=1; memcpy ( myString1, &sPtr[0], 1); array[0][0].color=myString1; memcpy ( myString2, &sPtr[1], 1); array[0][0].form=myString1; memcpy ( myString3, &sPtr[2], 1); array[0][0].tall=myString1; memcpy ( myString4, &sPtr[3], 1); array[0][0].inside=myString1; printf("hello world"); printf("%d %c %c %c %c\n", array[0][0].active, array[0][0].color,array[0][0].form,array[0][0].tall,array[0][0].inside); } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.78.230

05/18 17:32, , 1F
我怎麼覺得你 main 的大括號怪怪的...
05/18 17:32, 1F

05/18 17:34, , 2F
.....我先切腹一下
05/18 17:34, 2F

05/18 17:34, , 3F
local function
05/18 17:34, 3F

05/18 17:35, , 4F
另外 String_to_caracter 所使用的 array 有宣告嗎?
05/18 17:35, 4F

05/18 17:35, , 5F
(  ̄ c ̄)y▂ξ 你要不要順便把題目po上來, 幾乎都板
05/18 17:35, 5F

05/18 17:35, , 6F
友做完了阿
05/18 17:35, 6F

05/18 17:37, , 7F
http://pastie.org/1920850 這樣編譯會過
05/18 17:37, 7F

05/18 17:38, , 8F
array宣告應該拉到全域變數....我再切一次腹
05/18 17:38, 8F
※ 編輯: CS1DADA 來自: 122.118.78.230 (05/18 17:44)

05/18 17:44, , 9F
array[0][0].color=myString1 這個會過我覺得很詭異
05/18 17:44, 9F

05/18 17:46, , 10F
你給它很詭異的東西當然它會回送給你亂碼, 而且複製貼
05/18 17:46, 10F

05/18 17:46, , 11F
上好歹也檢查一下
05/18 17:46, 11F

05/18 17:49, , 12F
之前的文章有人問過你:你真的知道你在做什麼嗎?
05/18 17:49, 12F

05/18 17:51, , 13F
至少看一下編譯器的警告訊息吧
05/18 17:51, 13F

05/18 17:59, , 14F
你知道這樣做memcpy ( myString1, &sPtr[0], 1);
05/18 17:59, 14F

05/18 18:00, , 15F
你卻array[0][0].color=myString1;<==?你在寫java?
05/18 18:00, 15F

05/18 18:01, , 16F
還是當color是int or float?
05/18 18:01, 16F

05/18 18:02, , 17F
color是char,myString是char array?
05/18 18:02, 17F

05/18 18:26, , 18F
color是char,myString1也是char,不能用=直接assign
05/18 18:26, 18F

05/18 18:29, , 19F
痾...其實是可以assign的...
05/18 18:29, 19F

05/18 18:30, , 20F
囧我整個被稿亂了
05/18 18:30, 20F

05/18 18:31, , 21F
而且之前說的memcpy 是指的是你直接把string的內容
05/18 18:31, 21F

05/18 18:31, , 22F
用memcpy全部複製...
05/18 18:31, 22F

05/18 18:32, , 23F
到struct裡...
05/18 18:32, 23F

05/18 18:38, , 24F
也就是memcpy(name,str,sizeof(struct))...
05/18 18:38, 24F

05/18 18:49, , 25F
你的程式我改寫成這樣 http://pastie.org/1921088
05/18 18:49, 25F

05/18 18:52, , 26F
第15行註解寫錯了,應該是數字 10 才對 XD
05/18 18:52, 26F

05/18 21:45, , 27F
array[0][0].color=myString1;<=改成
05/18 21:45, 27F

05/18 21:45, , 28F
array[0][0].color=myString1[0],你那樣assign很怪
05/18 21:45, 28F

05/18 21:47, , 29F
array改成一維並且在函式內宣告.
05/18 21:47, 29F

05/18 21:48, , 30F
還有排版弄好點,眼睛好痛
05/18 21:48, 30F

05/18 22:02, , 31F
與其用mystring 那為何不直接用sPtr[0] sPtr[1] sPtr[2]..
05/18 22:02, 31F

05/18 22:03, , 32F
還有array[0][0].color=myString1[0];<==重覆四遍幹麼阿
05/18 22:03, 32F

05/18 22:05, , 33F
因為曾經是新手的我,只希望讓他知道他犯了什麼錯誤
05/18 22:05, 33F

05/18 22:06, , 34F
其實大家都曾是新手呀XD
05/18 22:06, 34F

05/18 22:08, , 35F
所以才希望用引導的方法,不然下次還是會不小心犯錯
05/18 22:08, 35F

05/18 22:08, , 36F
fscanf 用兩次 不知是否有別的意思...
05/18 22:08, 36F

05/18 22:08, , 37F
而且我以前大學就是這樣,QQ我程式能力才那麼爛
05/18 22:08, 37F

05/18 22:09, , 38F
我猜他要讀兩次,
05/18 22:09, 38F

05/18 22:11, , 39F
看到測試資料了 = =
05/18 22:11, 39F

05/18 22:13, , 40F
還是建議在使用檔案來寫以前 先用標準輸入輸出來看
05/18 22:13, 40F

05/18 22:20, , 41F
firejox的改寫是對的,問題出在fscanf,遇到空格會斷掉
05/18 22:20, 41F

05/18 22:21, , 42F
再來array[0][0].color=myString1[0]重複四次
05/18 22:21, 42F

05/18 22:50, , 43F
小幅改動 標準輸入輸出XD
05/18 22:50, 43F

05/18 23:22, , 44F
05/18 23:22, 44F

05/19 00:07, , 45F
我不懂 if (0&&(cfPtr=fopen 為什麼前面要有 0&& 呢?
05/19 00:07, 45F

05/19 00:09, , 46F
0 && 是強制 false 但是這的型態完全不對稱, 有轉型
05/19 00:09, 46F

05/19 00:10, , 47F
搭配短路徑, 檔也不會開
05/19 00:10, 47F

05/19 00:16, , 48F
fclose(stdin)是未定義行為, 每次看到 f 大的 code 心
05/19 00:16, 48F

05/19 00:16, , 49F
情都會很差...
05/19 00:16, 49F

05/19 00:30, , 50F
我忘了注解fclose了 XD
05/19 00:30, 50F

05/19 00:31, , 51F
那時貼上去才發現到fclose(stdin)的問題
05/19 00:31, 51F

05/19 00:32, , 52F
但是又改不了QQ
05/19 00:32, 52F

05/19 00:34, , 53F
不過型態不對稱是指前面int後面bool?
05/19 00:34, 53F

05/19 00:36, , 54F
0 to bool, && 後面不會做了
05/19 00:36, 54F

05/19 00:37, , 55F
c 裡的判斷式就有非0為真的功能 還有短路
05/19 00:37, 55F

05/19 00:38, , 56F
列舉當索引要小心負數, 嚴格來講 size_t 做註標最安全
05/19 00:38, 56F

05/19 00:39, , 57F
這我知道阿, 這邊根本不會有東西會變成 true
05/19 00:39, 57F

05/19 00:41, , 58F
在C裡if內應該是用int來看(我猜
05/19 00:41, 58F

05/19 00:53, , 59F
應該說我不懂為什麼要寫成這樣 XD
05/19 00:53, 59F

05/19 00:55, , 60F
方便呀 假如之後有一堆fscanf 你要改成scanf不就哭死
05/19 00:55, 60F

05/19 00:57, , 61F
你只要改開檔 關檔 還有給指標就好了呀
05/19 00:57, 61F

05/19 01:04, , 62F
那就會用巨集, 而不是改成這種德性
05/19 01:04, 62F

05/19 01:20, , 63F
我猜猜看 #define fscanf(a,b,...) scanf(b,__VA_ARGS__)
05/19 01:20, 63F

05/19 01:39, , 64F
養成寫fprintf/fscanf的好習慣, 多傳一個指標只會增加
05/19 01:39, 64F

05/19 01:39, , 65F
擴充性, 不會增加執行時間 http://goo.gl/ujfAe
05/19 01:39, 65F

05/19 12:46, , 66F
row1=column1=0; 請問這樣寫是什麼意思???
05/19 12:46, 66F

05/19 12:53, , 67F
assign to col,then col value assign to row.I guess
05/19 12:53, 67F

05/19 16:24, , 68F
fscanf(cfPtr,"%*s%s",board);為什麼要有*號??
05/19 16:24, 68F

05/19 16:45, , 69F
gigi1009和此發問者是同一個人嗎? 問題爆像的
05/19 16:45, 69F
文章代碼(AID): #1Dqv6cg6 (C_and_CPP)