2017-03-18 85 views
2

我試圖將字符串S作爲輸入。這裏字符串S可以包含多個整數值,後跟一個字母表。該程序必須根據先前的整數值擴展字母表。如何從字符串中讀取多個數字號碼

考慮輸入:4a5h 的量,輸出:aaaahhhhh,即4倍a倍和5倍h

同樣對於輸入:10a2b 輸出:aaaaaaaaaabb,即10倍a和2倍b

這是我的代碼:

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

int main() { 
    char s[1000], alp[1000]; 
    int num[1000]; 
    int n = 0; 
    int i, j, k, m; 
    k = 0; 
    scanf("%[^\n]s", s);//Reads string until newline character is encountered 
    for (i = 0; i < strlen(s); i++) { 
     if (isalpha(s[i])) { 
      alp[n] = s[i]; // alp[] stores the alphabets 
      n += 1; 
     } else { 
      num[k] = s[i] - '0';// num[] stores the numbers 
      k += 1; 
     } 
    } 
    for (i = 0; i < k; i++) { 
     for (m = 0; m < num[i]; m++) 
      printf("%c", alp[i]); 
    } 
    return 0; 
} 

但是,通過此代碼,我無法讀取2或3或N位數字。因此,如果輸入是100q1z那麼alp[]陣列很好,但num[]陣列不包含1001,因爲它的元素代替10是它的元素。

如何糾正這種代碼?

+0

1)'k'應'0'作爲初始值。 – BLUEPIXY

+0

感謝那@BLUEPIXY –

回答

2

你應該修改循環處理儘可能多的數字存在先後INT字符串:

#include <ctype.h> 
#include <stdio.h> 

int main(void) { 
    char s[1000], alp[1000]; 
    int num[1000]; 
    int i, k = 0, m, n; 

    //Read string until newline character is encountered 
    if (scanf("%999[^\n]", s) == 1) { 
     for (i = 0; s[i]; i++) { 
      n = 1; 
      if (isdigit((unsigned char)s[i])) { 
       for (n = s[i++] - '0'; isdigit((unsigned char)s[i]); i++) { 
        n = n * 10 + s[i] - '0'; 
       } 
      } 
      if (isalpha((unsigned char)s[i])) { 
       alp[k] = s[i]; // store the letter 
       num[k] = n; // store the number 
       k += 1; 
      } 
     } 
     for (i = 0; i < k; i++) { 
      for (m = 0; m < num[i]; m++) 
       putchar(alp[i]); 
     } 
    } 
    putchar('\n'); 
    return 0; 
} 

注:

  • 包括<ctype.h>使用isalpha()
  • 通過使字符的最大數目保護scanf目標數組並檢查返回值。
  • 用於將一個非空行的格式僅僅是%[^\n],後s不正確。請注意,與fgets()不同,如果該行爲空,則此scanf()格式將失敗。
  • 您應該始終測試scanf()的返回值。
  • char參數強制轉換爲isalpha()isdigit()作爲(unsigned char)以避免未定義的行爲,如果char已簽名並且具有負值。
  • 使用putchar(c)輸出單個字符,而不是printf("%c", c);
+0

這是完全正確的。我猜在內部if循環中有一個錯字。感謝@chqrlie –

+0

@ Lingesh.K:是的!答案已更正。 – chqrlie

0

與代碼的問題是,當你在字符串中遇到的一個數字,你正在考慮它作爲一個數並將其存儲在NUM陣列。

這是好的,如果你有數組中唯一單個數字

對於多位數字做這個 -
閱讀的數字,直到你利用所獲得的數字找到一個字母,形成一個數字,然後將其保存爲num陣列的字符串。

我離開代碼給你。

1

其他-bolock的部分必須循環。

這樣

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> //need this for isalpha and isdigit 

int main(void){ 
    char s[1000], alp[1000]; 
    int num[1000]; 
    int m = 0, n = 0; 
    int i, j; 
    unsigned char ch;//convert char to unsigned char before use isalpha and isdigit 

    scanf("%999[^\n]", s);//remove s after [^\n] and Add limit 
    for(i = 0; ch = s[i]; i++){//replace strlen each loop 
     if(isalpha(ch)){ 
      alp[n++] = s[i]; 
     } else if(isdigit(ch)){ 
      num[m] = 0; 
      while(isdigit(ch = s[i])){ 
       num[m] = num[m] * 10 + s[i] - '0'; 
       ++i; 
      } 
      ++m; 
      --i;//for ++i of for-loop 
     } else {//Insufficient as validation 
      printf("include invalid character (%c).\n", ch); 
      return -1; 
     } 
    } 
    for(i = 0; i < m; i++){ 
     for(j = 0; j < num[i]; j++) 
      printf("%c", alp[i]); 
    } 
    puts(""); 

    return 0; 
} 
+0

這將解析'a5d4'並生成'aaaaadddd'並在'a'和'5ab'等處調用未定義的行爲。 – chqrlie

+0

@chqrlie yes,驗證不足。 – BLUEPIXY

+1

另一方面,規範是不夠的;-) – chqrlie