[英]facing a challenge writing my own and my_itoa and my atoi, which should change integer to ascii and vice versa in C
[英]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.