2014-11-03 45 views
-4
char convertalphas(char s) { 

switch (s){ 
    case 'A': 
     return '0'; 
     break; 
    case 'B': 
     return '1'; 
     break; 
    case 'C': 
     return '2'; 
     break; 
    case 'D': 
     return '3'; 
     break; 
    case 'E': 
     return '4'; 
     break; 
    case 'F': 
     return '5'; 
     break; 
    case 'G': 
     return '6'; 
     break; 
    case 'H': 
     return '7'; 
     break; 
    case 'I': 
     return '8'; 
     break; 
    case 'J': 
     return '9'; 
     break; 
    case 'K': 
     return '10'; 
     break; 
    case 'L': 
     return '11'; 
     break; 
    case 'M': 
     return '12'; 
     break; 
    case 'N': 
     return '13'; 
     break; 
    case 'O': 
     return '14'; 
     break; 
    case 'P': 
     return '15'; 
     break; 
    case 'Q': 
     return '16'; 
     break; 
    case 'R': 
     return '17'; 
     break; 
    case 'S': 
     return '18'; 
     break; 
    case 'T': 
     return '19'; 
     break; 
    case 'U': 
     return '20'; 
     break; 
    case 'V': 
     return '21'; 
     break; 
    case 'W': 
     return '22'; 
     break; 
    case 'X': 
     return '23'; 
     break; 
    case 'Y': 
     return '24'; 
     break; 
    case 'Z': 
     return '25'; 
     break; 
} 
} 

int main() 
{ 

char astring[10]; 
int i = 0; 
int flag = 0; 
int startedalpha = 0; 
//check if there is a digit input or not 
int nodigit = 0; 
char cell[10]; 
int col; 
scanf("%s", &astring); 
for (i = 0; i < 10; ++i) 
{ 
if(astring[i] != '\0') { 

//check whether letter is capital or small 
if (astring[i] >= 65 && astring[i] <= 90) 
{ 
     startedalpha = 1; 

     //printf("%c\n", astring[i]); 
     cell[i] = convertalphas(astring[i]); 

     printf("cell is %s\n", cell); 
} 

即時嘗試做的是將所有轉換連接起來以備後用。當我放上「AB」時,它返回「01 @」,當我放上「Z」時,它返回「25」以外的東西。我不知道什麼是錯,但是這讓我瘋狂!我希望能夠輸入「ABZ」並將所有的值保存到變量單元中。例如,「ABZ」「0125」爲什麼字符串返回「@」或弄亂了我的「Z」?

謝謝!

我很困惑這個論壇。很明顯,我發佈了這個問題,因爲有些事情我不知道,我不像你們中的許多人一樣!那麼,爲什麼我會得到-2?我已經發布了我所嘗試的內容。我認爲這是關於幫助不居高臨下!

感謝那些無論如何回覆!

編輯 -

我將我switch語句來詮釋,但現在我怎麼可以連接在可變單元格中的整數?

+4

呃,''12''不一個合法的角色。 – 2014-11-03 17:36:00

+0

當你輸入'Z'時,你應該只返回一個字符,你怎麼能返回'25',2個字符? – AntonH 2014-11-03 17:36:12

+4

(當然,編譯器正在吐出警告信息,或許你應該閱讀它們。) – 2014-11-03 17:37:20

回答

1

按照C標準(6.4.4.4字符常數)

  • ...包含多於一個 字符的整數字符常數的值(例如, 「AB」),或含有一個字符或轉義序列 不映射到單個字節執行字符,是 實施-defined.All
  • 功能開始的所有的返回值從'10'到'25'包含的定義是imolementation,你可以得到你不期望得到的結果。

    你需要編寫一個定義應該像

    char * convertalphas(const char *s); 
    

    或者

    char * convertalphas(char *dest, const char *source); 
    

    順便說這將是很難做出反向轉換的功能。例如「25」是什麼意思?無論是「CF」還是「Z」?:)

    +0

    這是我在完成第一個問題後需要考慮的另一個問題! – 2014-11-03 18:05:56

    +0

    我會很感激任何想法。 – 2014-11-03 18:06:48

    +0

    @Spun a我會首先使用數字0-9,然後是字母'A','B'等。 – 2014-11-03 18:16:30

    1

    我注意到的一件事是你有一個char返回函數,並且返回的是別的不是char的東西,比如'10'。它會返回一個意想不到的值。例如,您可以將此函數的返回值設置爲整數。 所以它看起來是這樣的:

    int convertalphas(char s) { 
        switch (s){ 
        case 'A': 
         return 0; 
        case 'B': 
         return 1; 
        case 'C': 
         return 2; 
        case 'D': 
         return 3; 
        case 'E': 
         return 4; 
    
        return -1; 
    } 
    

    ,然後在循環內改變主要功能:

    sprintf(auxvar, "%d", convertalphas(astring[i]); 
    for(jj = 0; jj < strlen(auxvar); jj++) 
        cell[i++] = auxvar[jj]; 
    

    我希望它可以幫助你不知何故! 祝你好運。

    +0

    謝謝!但它不起作用。當我把AB,它返回錯誤的價值。 – 2014-11-03 18:04:38

    +0

    @Spuna你是什麼意思,放AB?您不能將兩個字符的字符串傳遞給接受字符的函數。如果你的意思是你通過了一個「AB」,即一個多字節字符,那麼你需要查看'wchar_t'的支持。你最大的問題似乎是你沒有提高編譯器的警告級別。它會在現場告訴你,convertalphas不會返回所有路徑的值。 – Jens 2014-11-03 18:09:22

    +0

    那我怎樣才能傳遞兩個字符串?因爲這就是我想要做的。 – 2014-11-03 18:14:42

    0
    由字符「K」直通「Z」(如其他人所說)還有一些其他錯誤與使用 cell

    每個人物從你的函數返回寫入cell[],然後返回的值

    除了您打印cell作爲一個字符串。但是沒有字符串終止符。你要麼需要填寫cell[]用零第一,或者寫一個0到下一個字符

    cell[i] = convertalphas(astring[i]); 
    cell[i+1] = 0; 
    

    但這樣做的問題是,當char是不是一個大寫字母cell[i]被跳過。你需要維護一個單獨的索引cell[]

    cell[j++] = convertalphas(astring[i]); 
    cell[j] = 0; 
    

    還有一個問題是cell[]不是最終的字符串結束足夠長的時間。您需要將其聲明爲

    char cell[11]; 
    
    0

    總之,你的問題是:

    1. 一個char函數不能返回比字符以外的任何其他。
      如果你試圖返回類似'12'的東西,它根本就不起作用。你需要重新考慮你的算法。使用int來實現這一點應該非常簡單。

    2. 這是一項家庭作業,需要使用switch聲明嗎?如果沒有,並且如果您按照建議返回int而不是char,則簡單的s-65就可以做到這一點,您不需要78行switch

    3. 由於cellchar陣列的cell每個元素也只能存儲單一字符
      這是不是很清楚你想達到什麼,所以我會嘗試以兩種方式理解它:

      3.1。你想要在單元格中分別存儲每個字符的值。
      示例:對於輸入「ABZ」,您希望cell爲{0,1,25}。
      這很簡單。將cell更改爲int陣列,並在printf中使用%d格式說明符輸出它們。

      3.2您將cell視爲字符串而不是字符數組,並且將字符串連接爲每個字符的值。
      例如:對於輸入「ABZ」,您希望cell爲「0125」,或換句話說,{'0','1','2','5'}。這意味着您不能像其他人指出的那樣區分「ABZ」和「AMF」。
      如果這是你想達到的目標,首先10個元素是不夠的cell - 每個字符必須分開存儲,並且不能將「25」作爲兩個字符存儲在單元格的單個元素中。

    你可以用,比如分配給它,21元(最多2個每個字母,一個額外的終止'\0'字節)。將每個字母轉換爲int後的值後,實施一個計數器和一些條件,以一次填充cell一個字符。例如,如果一個字母的值存儲在val

    char cell[21]; 
    int i=0; 
    if(val < 10) { 
        cell[i] = val + '0'; 
        i++; 
    } else { 
        cell[i] = val/10 + '0'; 
        i++; 
        cell[i] = val % 10 + '0'; 
        i++; 
    } 
    

    我將離開這個實施成一個圈作爲練習你...

    相關問題