如何将字符数组更改为整数数组?

时间:2015-02-06 05:09:47

标签: c

更具体地说,我如何更改'

char tempList[256] = "1 -2 -8 4 5";

这样的事情:

int tempListNum[256] = {1, -2, -8, 4, 5};

我尝试了这个,但我不知道如何追加数组。

for (int j = 0; j < 256; j++)
{
    if(TEMPS[j] == 45 && (TEMPS[j+1] >= 48 && TEMPS[j+2] >= 48))
    {
        numToAppend = ((TEMPS[j+1]-'0')*10 + (TEMPS[j+2]-'0')) * -1;
    }
    if(TEMPS[j] == 45 && TEMPS[j+1] >= 48)
    {
        numToAppend = (TEMPS[j+1]-'0') * -1;
    }
    if(TEMPS[j] >= 48)
    {
        numToAppend = TEMPS[j]-'0';
    }
    if(TEMPS[j] >= 48 && TEMPS[j+1] >= 48)
    {
        numToAppend = TEMPS[j]*10 + TEMPS[j+1];
    }
}

9 个答案:

答案 0 :(得分:1)

你可以使用带空格的strtok作为分隔符然后使用atoi标准库函数

答案 1 :(得分:0)

例如,使用while循环和函数来自strings.h的sscanf和strtok。

#include <stdio.h>
#include <string.h>
int main (void)
{
    char tempList[256] = "1 -2 -8 4 5";
    int tempListNum[256] = {0};
    int cnt = 0;
    int tmp = 0;
    char * str = strtok (tempList," ");
    while(str != NULL)
    {
        if(sscanf(str, "%d", &tmp))
        {
            tempListNum[cnt] = tmp;
            cnt++;
        }
        // read next number
        str = strtok (NULL," ");
    }
    // test output
    for(tmp = 0; tmp < cnt; tmp++)
    {
        printf("%d ", tempListNum[tmp]);
    }
    return 0;
}

在Visual Studio 2012中测试。

答案 2 :(得分:0)

通过tempList编写一个经过char char的函数:

  • 虽然它只遇到数字,但应将它们变成int。如果有多个数字,则应将第一个数字与10相乘,然后添加,然后将其添加到int等。

  • 遇到空格时,应将新创建的int添加到tempListNum并跳过该空格。

  • 当遇到减号时,它应该将当前创建的int-1相乘。

  • 重复这些步骤,直至列表末尾。

答案 3 :(得分:0)

你可以试试这个

unsigned char index1 = 0,index2 =0;
int PrevValue = 0;
for(;index1 <= 255;index1 ++)
{
      if(tempList[index1] != ' ') //space
      {
         tempListNum[index2] = PrevValue*10 + (tempList[index1]-0x30);
         PrevValue = tempListNum[index2] ;

      }
      else
      {  
           PrevValue  = 0;
           index2++;
      }

}

您可以添加进一步的优化和其他验证。

答案 4 :(得分:0)

使用它:它适用于我。

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

int main() {
    char tempList[256] = "1 -2 -82 43 5";
    char tempNumber[10];
    int tempNumberCounter = 0;
    int i, j,counter=0, isNegative = 1;
    int numTempList[256] = {0};

    for(i=0; tempList[i] != '\0'; i++) {

        if(tempList[i-1] == '-') {
            isNegative = -1;
        }

        if(isdigit(tempList[i])) {
            tempNumber[tempNumberCounter] = tempList[i];
            tempNumberCounter++;
        }

        if(tempList[i] == ' ' || tempList[i+1] == '\0') {
            tempNumber[tempNumberCounter] = '\0';

            for(j=0; j<strlen(tempNumber); j++) {
                numTempList[counter] += (tempNumber[j] - '0') * pow(10, strlen(tempNumber)-j-1);
            }           

            numTempList[counter] *= isNegative;
            counter++;
            tempNumberCounter = 0;
            *tempNumber = 0;
            isNegative = 1;
        }

    }

    for(i=0; numTempList[i] != 0; i++) {
        printf("%d ", numTempList[i]);
    }
    return 0;
}

numTempListtempList转换后的数组。这只是char到int数组的示例实现,您可以将其重构为函数,以便您可以重用此功能。

修改:

现在它也可以读取多个数字

答案 5 :(得分:0)

你可以试试这个:

char tempList[256] = "1 -2 -8 4 5";
int tempListNum[256]

int i=0,k=0;
while(i<256)
{
  int num=0;
  for(int j=0;tempList[j]!=' ';j++)
  {
    int neg=0,counter=0; //Not worked in C for a long time and I am not sure if it supports Bools
    if(a[j]=='-')
     neg=1;
    else
     num=num*10+int(tempList[j])-int('0');
    counter++;
 }
  if(neg==1)
   num=-num;
  tempListNum[k]=num;
  k++; i+=counter;
}

答案 6 :(得分:0)

这不是非常困难。我建议使用自定义strtoi功能而不是atoi,因为atoi允许进行少量错误处理。例如,atoi("1.3")将返回1而没有其他方式来获取其他信息,例如&#34; .3&#34;使它不是一个整数。此外,值1显然在int类型的范围内,因此即使errno也没有帮助。

这就是为什么我编写并使用下面的strtoi,它使用C库的strtol函数并具有相同的行为。如果您需要帮助了解strtoi的作用,请查看strtol的文档,因为除了有效值范围(INT_MIN和{{1之间)之外,它们几乎相同无论是包含在内,还是在INT_MAXLONG_MIN之间,都是包含在内的。

LONG_MAX

你显然可以避免使用#include <stdio.h> #include <stdlib.h> //strtol #include <string.h> //strtok #include <limits.h> //INT_MIN, INT_MAX #include <errno.h> //errno, ERANGE int strtoi (const char *s, char **rem, int base) { long n; int esave = errno; errno = 0; n = strtol (s, rem, base); if (n < INT_MIN || n > INT_MAX) errno = ERANGE; if (errno) { if (n == LONG_MAX) return INT_MAX; return INT_MIN; } errno = esave; return (int) n; } int main (void) { char tempList[256] = "1 -2 -8 4 5"; int tempListNum[128] = {0}; int i, n; char *listPtr; char *listPtr2; listPtr = strtok (tempList, " "); for (i = 0; listPtr != NULL && (size_t) i < sizeof tempListNum / sizeof tempListNum[0]; ++i) { errno = 0; n = strtoi (listPtr, &listPtr2, 10); if (*listPtr2) { fprintf (stderr, "error: value `%s' is not an integer ... ignoring value\n", listPtr); --i; } // value out of range or some other implementation-defined error else if (errno) { perror (listPtr); } listPtr = strtok (NULL, " "); } // n is now the number of items in the array n = i; for (i = 0; i < n; ++i) printf ("%d\n", tempListNum[i]); } ,而只是单独使用strtok。这实际上可能是一个更清洁的解决方案!

答案 7 :(得分:0)

这是家庭作业,还是面试问题?

我还没有测试过这个,但你可以这样做:

#define enum _error {
   success = 0,
   parse_error,
   out_of_memory,
   invalid_arg,
   insuficient_buffer
} error;

error parse_int(
   char **pp,
   int *val)
{
   error e = success;
   char neg = 0;

   if (!pp || !*pp || !val) {
      e = invalid_arg;
      goto exit;
   }

   *val = 0;

   while (**pp) {
      if (**pp == '-') {
         if (val) {
            e = parse_error;
            goto exit;
         }

         neg = 1;
      }
      else if (**pp >= '0' **pp <= '9') {
          *val *= 10;
          *val += **pp - '0';
      }
      else {
         break;
      }

      ++*pp; 
   }

   if (neg) {
      *val *= -1;
   }

exit:

   return e;
}

error parse_array_of_ints(
   char *p,
   unsigned int parsed_ints_size,
   int **parsed_ints)
{
   error e = success;
   unsigned int cur = 0;

   if (!p || !parsed_ints) {
      e = invalid_arg;
      goto exit;
   }

   for (;;) {
      while (*p && *p != '-' && *p < '0' && *p > '9') {
         p++;
      }

      if (!*p) {
         break;
      }

      if (cur = parsed_ints_size) {
         e = insuficient_buffer;
         goto exit;
      }

      e = parse_int(&p, parsed_ints+cur);

      if (e != success) {
         goto exit;
      }

      cur++;
   }

exit:

   return e;
}

答案 8 :(得分:0)

考虑这个简短的例子:

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

int main ()
{
  char tempList[256] = "1 -2 -8 4 5";
  int tempListNum[256] = {0};
  int numCnt = 0;
  char * pEnd = tempList;
  int number = 0;
  while( strlen(pEnd) > 0)
  {
    tempListNum[numCnt] = strtol (pEnd,&pEnd,0);
    numCnt++;
  }
  for(number = 0; number < numCnt; number++)
  {
      printf("%d ", tempListNum[number]);
  }
  return 0;
}