2

在 CI 中编程时,遇到了以下代码片段:

从 char 数组转换input为 integer 数组digit时,仅将 ANSI 代码转换为 digit 数组。

如何确保为该数组提供正确的整数值?

这是相关代码:

int main(void) {
    int x = 0;
    int y = 0 
    char input[12] = {0};
    int digit[12] = {0};

    scanf("%s", &input[0]);
    fflush(stdin);

    while (input[y] != '\0') {
        if (isdigit(input[y])) {
            digit[x++] = input[y++];
            count++;
        }
        else y++;
    }
}
4

5 回答 5

2
scanf("%s", &string[0]);  

读入input字符数组。您正在阅读其他一些变量。

scanf("%s",input);

甚至最好

fgets(input,sizeof input, stdin );

  digit[x++] = input[y++]-'0';   
   // substract `'0'` from your character and assign to digit array.

例如,如果input[i]=='3'==>'3'-'0'将导致整数位3

于 2013-10-19T16:58:26.070 回答
1

我建议您在循环中使用strtolsscanf 。这会让你的事情变得更容易。

像这样的东西:

char *c = "12 23 45 9";
int i[5];
sscanf(inputstring, "%d %d %d %d %d", &i[0], &i[1], &i[2], &i[3], &i[4]);

使用 atoi() 的示例示例,其中另一个选项:

int main(int argc,char *argv[]){
    char y[10] = "0123456789";
    char x[3];
    int i;

    x[0] = y[8];
    x[1] = y[9];
    x[2] = '\0';

    i=atoi(x);
}
于 2013-10-19T16:59:12.783 回答
0

在 ASCII 中,数字符号以 0、1、2、3、4、5、6、7、8、9 的顺序出现。所以你所要做的就是:

if (isdigit(input[y])) {
    digit[x++] = input[y++] - '0';

如果数字是'0','0' - '0' = 0,如果数字是'1','1' - '0' = 1,依此类推。

请参阅Wikipedia ASCII Quickref 卡上的 0x3 列。

于 2013-10-19T17:06:39.067 回答
0

这是我解析所有可以与其他字符混合的数字的解决方案。

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

uint8_t atoia(char *src, int *dst, int len){
  // This function convert char array with digits into ints array.
  // In addition return amount of digits that was able to find in *src.
  // If more digits is in *src then max size of *dst, then zero is returned and 
  // *dst is zeroed.
  uint8_t k=0;
  uint8_t x=0;
  dst[x] = 0;
  while(*src++){
    if (*src >= '0' && *src <= '9'){
      if (x > len-1){
        memset(dst, 0, len*sizeof(uint8_t));
        return 0;
      }
      dst[x] = dst[x]*10 + *src - '0';
      k = 1;
    } else if (k>0){
      x++;
      dst[x] = 0;
      k = 0;
    }
  }
  return x;
}

int main(void){
  printf("Hello :)\n");
  char *buf = "This is mixed string 3 0 12 233 18 100 321 and 231 123345";
  int k=0;
  int dst[9]={0};

  k = atoia(buf, dst, 9);
  while(k--){
    printf("Number: %d: %d\n", k, dst[k]);
  }
  return 0;
}

结果:

Hello :)
Number: 8: 123345
Number: 7: 231
Number: 6: 321
Number: 5: 100
Number: 4: 18
Number: 3: 233
Number: 2: 12
Number: 1: 0
Number: 0: 3
于 2017-08-30T10:50:10.917 回答
0

您必须做一些改进,我们必须确保 int 数字数组,数组大小应该与您输入的输入量相同,例如。

input[12] : 12451'\0' <--- size of array of input is 12

输出 :-

digit[12] : 124510000000

因为剩余的数组大小未使用,所以我们必须确定你输入的输入量是数字数组的大小

int main(void) {
  int x = 0;
  int y = 0 
  char input[12] = {0};


  scanf("%s", &input[0]);
  int ch_len = strlen(input)/sizeof(char);
  int digit[ch_len];    
  fflush(stdin);

  while (input[y] != '\0') {
      if (isdigit(input[y])) {
          digit[x++] = input[y++]-'0';
          count++;
      }
      else y++;
  }
}
于 2016-02-11T15:05:27.860 回答