簡體   English   中英

編寫我自己的atoi函數

[英]Writing my own atoi function

我正在嘗試將一串數字字符轉換為它們相應的整數形式。 請提出代碼有什么問題。 我想堅持使用指針。 我知道指針str指向字符串中的第一個字符。 因此,每次我在循環中調用函數時,都希望指針增加1,並將字符值添加到數組中的一個節點。 由於某些原因,盡管我無法這樣做。 這是代碼。

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

int ctoi(char *c);

int main (void)
{
    char *str;
    int A[20];
    int i = 0;
    str = (char*) malloc(20 * sizeof(char));
    printf("Input the string. ");
    scanf("%s", str);
    while(str != '\0')   
    {
        A[i] = ctoi(str);
        i++;
        str++;
    }
    for(i = 0; i < strlen(str); i++)
        printf("%d", A[i]);

    getchar();
    getchar();
    return 0;
}

int ctoi(char *c)
{
    int a;
    a= *c - '0';
    return a;
}

for (i=0;i<strlen(str);i++) printf("%d", A[i]);

在這里strlen將返回0,因為您在上一個循環中更新了str。將其替換為:

for(i=0;i<len;i++) 

其中len是輸入字符串的長度。在while循環中使用str之前先查找它

while(str!='\0') should be `while(*str!='\0')`

你會得到的 。 但是對於編寫自己的atoi函數,您不需要將數字存儲在數組中

請嘗試使它起作用,myatoi()函數可能是20年前從經典的“ THE C PROGRAMMING LANGUAGE”中取消的,請購書。

#include <stdio.h>

main()
{
    char temp[99];

    strcpy(temp , "34");

    printf( "\n %d " , myatoi(temp));
    strcpy( temp , "8642");
    printf( "\n %d " , myatoi(temp));
}


int myatoi( char s[])
{
    int i,n,sign;
    // skip white space
    for( i=0 ; s[i]==' ' || s[i]=='\n' ||s[i]=='\t';i++) ;

    sign=1;
    if( s[i]=='+' || s[i]=='-')
        sign=( s[i++]=='+' ? 1 : -1 );

    for( n=0; s[i]>='0' && s[i]<='9' ; i++)
        n=10*n+s[i]-'0' ;

    return(sign*n);
}

OP的代碼需要一些(至少2個)修復才能正常工作。 見***

int main (void)
{
    char *str;
    int A[20];
    int i = 0;

    // ***  Cast not needed, '* sizeof(char)' not needed
    str = malloc(20);

    printf("Input the string. ");
    scanf("%s", str);

    // ***
    char *str_original = str;
    while(*str != '\0')


    {
        A[i] = ctoi(str);
        i++;
        str++;
    }

    // ***
    str = str_original;

    for(i = 0; i < strlen(str); i++)
        printf("%d", A[i]);

    // ***
    free(str);  // Good to return memory
    str = NULL;

    getchar();
    getchar();
    return 0;
}

將字符串轉換為int簡單方法

int strtoi(const char *s) {
  int sum = 0;
  char ch;
  char sign = *s;
  if (*s == '-' || *s == '+') s++;
  while ((ch = *s++) >= '0' && ch <= '9') {
    sum = sum * 10 - (ch - '0');
  }
  if (sign != '-') {
    sum = -sum;
  }
  return sum;
}

注意:此代碼在嘗試為INT_MIN解析字符串時將負數的和累加到0的負數,以避免UB。 修改后的代碼可以跳過前導空白,添加文本錯誤檢測,溢出檢測等。

這是我的自定義atoi函數,它們使用調試手勢處理unsigned int:

int     my_getnbr(char *str)
{
  int   nb;
  int   sign;
  int   i;

  nb = 0;
  sign = 0;
  i = -1;
  if (!str)
    return (0);
  while (str[++i])
    if (str[i] < '0' && str[i] > '9' && str[i] != '-' && str[i] != '+')
      return (0);
  i = 0;
  while (str[i] != '\0' && (str[i] == '-' || str[i] == '+'))
    if (str[i++] == '-')
      ++sign;
  while (str[i] && (str[i] >= '0' && str[i] <= '9'))
    {
      nb = (nb * 10) + (str[i++] - '0');
      if (str[i] == ' ')
        i++;
    }
  return (((sign % 2) == 1) ? ((nb) * (-1)) : (nb));
}

用主測試:

int main()
{
  printf("%d\n", my_getnbr("-42"));
  printf("%d\n", my_getnbr("-+-+--42"));
  printf("%d\n", my_getnbr("-0"));
  printf("%d\n", my_getnbr("590310"));
  return (0);
}

沒有泄漏,結果如下:

-42
42
0
590310

首先

while(str!='\\0')應該是

while(*str!='\0')

您應該比較內容,而不是地址。

在打印返回的數據時,您正在做

for(i=0;i<strlen(str);i++)
   printf("%d", A[i]);

str已經解析到最后。 因此長度可能為0。

將您的while循環更改為

 while(*str!='\0')   
      {   
        A[i]=ctoi(*str);
        i++;
        str++;
      } 

而你的功能

int ctoi(char c)
 {
 int a;
 a= c-'0'; 
 return a;
 }

strtol沒有base轉換靈活性的情況下,有幾種方法可以實現簡單的atoi替換。 最簡單的方法通常是找到要轉換的字符串的長度,然后向后朝字符串的前部進行操作,以完成從字符串到整數的轉換。 一個簡單的例子是:

/* a quick atoi replacement */
int atoi2 (char *s)
{
    int nmax = (1ULL << 31) - 1;    /* INT_MAX  */
    long long n = 0;    /* the number to return */
    size_t m = 1;       /* multiplier for place */
    size_t l = 0;       /* length of string     */

    char *p = s;
    while (*p++) l++;   /* get string length        */
    p -= 2;             /* position at last char    */

    while (l--)         /* for each char in string  */
    {   /* verify a digit or '-' sign */
        if ((*p >= '0' && *p <= '9') || *p == '-')
        {
            if (*p == '-') { /* if '-' is first char */
                if (p == s) n = -n;  /* negate value */
            }
            else {  /* otherwise normal conversion   */
                n += (*p - '0') * m;
                if (n > nmax) { /* prevent overflow  */
                    fprintf (stderr, "atoi2() error: conversion > INT_MAX.\n");
                    exit (EXIT_FAILURE);
                }
                m *= 10;
            }
        }
        p--;
    }
    return (int) n;
}

要測試的簡單驅動程序可以是:

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

int atoi2 (char *s);

int main (int argc, char **argv) {

    if (argc < 1) return 1;

    printf ("\n string : %s, conversion : %d\n\n",
            argv[1], atoi2 (argv[1]));

    return 0;
}

使用/輸出示例

$ ./bin/atoi2 321

 string : 321, conversion : 321

$ ./bin/atoi2 -321

 string : -321, conversion : -321


$ ./bin/atoi2 2147483647

 string : 2147483647, conversion : 2147483647

$ ./bin/atoi2 2147483648
atoi2() error: conversion > INT_MAX.

如有任何疑問,請隨時詢問。

這是一個自定義的atoi函數,避免使用大多數標准庫函數

/*** _atoi - finds the first set of integers in a given string
 * @s: string entered
* Return: first number sequence
**/

int _atoi(char *s)
{
    int length = 0, negativeCount = 0, count = 0, num = 0;

    while (s[length] != '\0')
    {
        length++;
    }
    while (count < length)
    {
        if (s[count] == '-')
        {
            negativeCount++;
        }
        if (s[count] >= 48 && s[count] <= 57)
        {
            /* ascii values for numbers */
            for (; s[count] >= 48 && s[count] <= 57; count++)
            {
                num = (10 * num - (s[count] - 48));
            }
            break;
        }
        count++;
    }
    if (negativeCount % 2 != 0)
    {
        return (num);
    }
    else
    {
        return (-num);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM