将字符串解析为C中的数字

时间:2018-05-26 12:40:43

标签: c

我尝试编写一个函数来将字符串转换为int

int convert(char *str, int *n){
    int i;
    if (str == NULL) return 0;
    for (i = 0; i < strlen(str); i++)
        if ((isdigit(*(str+i))) == 0) return 0;
    *n = *str;
    return 1;
}

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

*n = *str表示: 将n指向的4个字节的内存设置为str指向的1字节内存。这很好,但可能不是你的意图。

为什么要首先将char *转换为int *?如果您只是需要进行转换并使编译器满意,那么您可以int *foo = (int*)bar bar char*。{/ p>

很抱歉,我没有声誉来发表评论。

答案 1 :(得分:0)

该功能肯定无法按预期运行。

以下是一些问题:

  • 您应该<ctype.h>包含isdigit()才能正确定义。

  • 如果isdigit(*(str+i))包含负str值,则
  • char具有未定义的行为。你应该抛出这个论点:

    isdigit((unsigned char)str[i])
    
  • 如果字符串中有任何非数字字符,则函数返回0。那么"-1""+2"怎么样? atoistrtol对非数字字符更宽松,它们会跳过初始空格,处理可选符号和后续数字,停在第一个非数字处。

  • 测试for (i = 0; i < strlen(str); i++)非常低效:可以为字符串中的每个字符调用strlen,其中 O(N 2 时间复杂性。请改用:

    for (i = 0; str[i] != '\0'; i++)
    
  • *n = *str不会转换 str中数字所代表的数字,它只会将第一个字符的值存储到n中,例如'0'将在ASCII系统上转换48。您应该处理字符串中的每个数字,将到目前为止转换的值乘以10,并将数字表示的值与str[i] - '0'相加。

以下是具有限制性语义的更正版本:

int convert(const char *str, int *n) {
    int value = 0;
    if (str == NULL)
        return 0;
    while (*str) {
        if (isdigit((unsigned char)*str)) {
            value = value * 10 + *str++ - '0';
        } else {
            return 0;
        }
    }
    *n = value;
    return 1;
}

答案 2 :(得分:-1)

将char *指针转换为int *

#include

main()的

{

 char c ,*cc;

 int i, *ii;

  float f,*ff;

  c = 'A'; /* ascii value of A gets 

  stored in c */

   i=25;

    f=3.14;

    cc =&c;

     ii=&i;


     ff=&f;

      printf("\n Address contained 

      in cc =%u",cc);

      printf("\n Address contained

       in ii =%u",ii);

       printf(:\n Address contained

       in ff=%u",ff);

       printf(\n value of c= %c",

       *cc);

       printf(\n value of i=%d",

       **ii);

       printf(\n value of f=%f",

       **ff);

       }