2016-08-14 40 views
1

分隔整數我想創建兩個陣列,一個是字符陣列和第二是一個整數陣列。兩者都是在用戶提供關於整數元素數的輸入時動態創建的。所有整數都由空格分隔。如何動態創建的字符數組轉換成整數數組,當輸入與空間

輸入:

第一行包含N,這裏N是整數的數量。假設用戶輸入5,下一行將包含由空間分隔的整數N。即由5個整數5 10 23 456 2

輸出:

輸出將顯示從整數數組中的元素,即int_array[i], int_array[i+1] .... 5,10 ...

但是,當我跟我的代碼試過,我只能看到0的來自整數數組。

下面是代碼:

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

int *cstois(char *char_array, int *int_array, int n) { 
    int i, j; 
    for (i = 0, j = 0; i < n; i++) { 
     if (char_array[i] >= '0' && char_array[i] <= '9') { 
      int_array[j] == int_array[j] * 10 + (char_array[i] - '0'); 
     } else 
     if (char_array[i] == ' ') { 
      j++; 
     } else 
      continue; 
    } 
    return int_array; 
} 

int main() { 
    int i, n; 
    printf("enter no. of elements"); 
    scanf("%d\n", &n); 
    char *char_array; 
    char_array = (char*)malloc(n * sizeof(int)); 
    fgets(char_array, sizeof(char_array), stdin); 
    int *int_array = (int*)calloc(n, sizeof(int)); 
    cstois(&char_array[0], &int_array[0], n); 
    for (i = 0; i < n; i++) 
     printf("%d\n", int_array[i]); 
    free(char_array); 
    free(int_array); 
    return 0; 
} 
+0

如果您有一個包含整數的文件,爲什麼要將它們作爲文本讀取?爲什麼不使用例如'fscanf'在循環中? –

+0

'int_array [j] == int_array [j] * ...'??比較沒有打算?哦,複製/粘貼,你是一個冷酷的丫頭。解決這個問題之後,你會發現它仍然不起作用,因爲'var'最初爲零時(在你的'calloc'之後)'var = var * anything'永遠不會太多。這只是一個需要注意的設計缺陷。 – WhozCraig

+0

對不起,這是一個'='我打錯了。 –

回答

0

有你的代碼中的多個問題:

  • 沒有標準的頭<malloc.h>。在<stdlib.h>中定義了malloc()

  • 在功能cstois(),你不正確的更新,因爲一個錯字的數量:int_array[j] == int_array[j] * 10 + (char_array[i] - '0');應該int_array[j] = int_array[j] * 10 + (char_array[i] - '0');

  • 你忽略不是數字也不是空格字符的所有字符。這不一定是正確的:爲123,而不是被報告爲錯誤1,2,3將被解析。

  • 差很多,甚至,你不掃描輸入緩衝區時檢查'\0'。如果從用戶讀取的行中沒有足夠的數字,則掃描字符串的末尾並可能超出數組末尾,從而調用未定義的行爲。

  • 你跳到於空格字符的下一個元素。用多個空格分隔數字會導致數字被錯誤地跳過。

  • 您無法處理負數。

  • in function main(),輸入數組分配爲char_array = (char*)malloc(n * sizeof(int));。這是不正確的,因爲它將32位整數的平均位數限制爲3 ......您應該爲每個數字分配至少20位數以允許使用大整數。

  • fgets()用戶讀取的行很短:sizeof(char_array)是指針的大小,而不是爲數組分配的大小。將該大小保存到變量並將其傳遞給malloc()fgets()

  • 您不檢查返回值scanf(),也不是fgets()malloc()。空文件將無法正確處理。

一個簡單的方法來處理多個空格分隔數和負數是使用strtol()

int *cstois(char *char_array, int *int_array, int n) { 
    for (int i = 0; i < n; i++) { 
     int_array[i] = strtol(char_array, &char_array, 10); 
    } 
    return int_array; 
} 

這個簡單的執行將停在第一個非數量和0填寫int_array所有剩餘項。缺失的數字同樣會在數組中產生零值。

+0

非常感謝你查理,我會盡力解決你在這裏給我看的所有問題。 –

+0

您可以通過單擊答案分數下面的灰色複選標記來接受此答案。 – chqrlie

+0

thanx查理再次,我已經完成了程序,我會優化它來處理多個空間和負值。 –

0

我打印輸入後的字符串,我看到有值,直到沒有空間發生。我有任何修改的帽子,我應該用fgets進行修改。這是修改後的代碼。

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

int *cstois(char *char_array, int *int_array, int n) { 
    int i, j; 
    for (i = 0, j = 0; i < n; i++) { 
     if (char_array[i] >= '0' && char_array[i] <= '9') { 
      int_array[j] = (int_array[j] * 10) + (char_array[i] - '0'); 
     } else 
     if (char_array[i] == ' ') { 
      if (i == 0) 
       continue; 
      else 
       j++; 
     } else { 
      continue; 
     } 
    } 
    return int_array; 
} 

int main() { 
    int i, n, length_of_char; 
    printf("enter no. of elements"); 
    scanf("%d\n", &n); 
    char *char_array; 
    char_array = (char*)malloc(n * 5); 
    fgets(char_array, sizeof(char_array), stdin); 
    printf("%s\n", char_array); 
    length_of_char = strlen(char_array); 
    printf("%d\n", length_of_char); 
    int *int_array = (int*)calloc(n, sizeof(int)); 
    cstois(&char_array[0], &int_array[0], length_of_char); 
    for (i = 0; i < n; i++) 
     printf("%d\n", int_array[i]); 
    free(char_array); 
    free(int_array); 
    return 0; 
} 
+0

你的測試'if(i == 0)continue;'只有當第一個字符是空格時才起作用。看看我的編輯,學會縮進並將代碼放在空間中,以便閱讀。 'fgets()'仍然只讀取3個字節左右...使用數組的長度,而不是'sizeof(char_array);'。 – chqrlie