C程序调用一个字符串到int函数,我无法转换输入

C program calling a string to int function, I am unable to convert the input

我想将字符串转换为 int 并从 main 调用该函数。其中第一个字符是声明数字基数的字母,字符串中的其余字符是数字。我能够让函数单独工作,但是当使用 main 函数调用它时,它不会打印出正确的值。

使用二进制的用户输入示例:

b1000
b1010

结果应该是:

b
b
1000
1010

代码如下:

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

int str_to_int(inputbase) {
    char num1[50];
    num1[50] = inputbase;

    char numcpy1[sizeof(num1) - 1];

    int  i, len1;
    int result1 = 0;

    //printf("String: ");
    //gets(num1);

    //Access first character for base
    printf("%c \n", num1[0]);

    //Remove first character for number1 and number 2
    if (strlen(num1) > 0) {
        strcpy(numcpy1, &(num1[1]));
    } else {
        strcpy(numcpy1, num1);
    }
    len1 = strlen(numcpy1);

    //Turn remaining string characters into an int
    for (i = 0; i < len1; i++) {
        result1 = result1 * 10 + ( numcpy1[i] - '0' );
    }

    printf("%d \n", result1);
    return result1;
} 

int main() {
    char *number1[50], *number2[50];
    int one, two;

    printf("\nAsk numbers: \n");

    gets(number1);
    gets(number2);

    one = str_to_int(number1);
    two = str_to_int(number2);

    printf("\nVerifying...\n");
    printf("%d\n", one);
    printf("%d\n", two);

    return 0;
}

我想你的代码可能因为某些错误而无法编译。

第一个在行

 int str_to_int(inputbase)

其中 inputbase 没有类型定义。

如果改为

 int str_to_int(char * inputbase)

下一个改进点在行

 num1[50] = inputbase;

这样的作业有一组错误:

  1. num1[50]表示访问第51项,但是索引从0到49的项只有50项
  2. 语句 num1[0] = inputbase;(以及任何其他正确的索引)是错误的,因为类型不同:num1[0]char,但 inputbase 是指针
  3. num1 = inputbase;也会出错(因为复制字符串=不能在C中使用,所以考虑制作循环或使用标准库函数strncpy

而且由于这只是问题的开始,我建议使用一些标准函数从十进制输入开始,将字符串 char* 转换为 int(例如 atoi,或 sscanf), 然后在你检查程序并发现它是正确的如果需要你可以避免使用标准转换并编写你自己的 str_to_int

函数 str_to_int() 的原型应指定 intputbase 的类型。你传递的是一个字符串,没有理由 str_to_int 修改这个字符串,所以类型应该是 const char *inputbase.

此外,您不需要字符串的本地副本,只需访问第一个字符以确定基数并相应地解析其余数字:

#include <stdlib.h>

int str_to_int(const char *inputbase) {
    const char *p = inputbase;
    int base = 10;    // default to decimal

    if (*p == 'b') {  // binary
        p++;
        base = 2;
    } else
    if (*p == 'o') {  // octal
        p++;
        base = 8;
    } else
    if (*p == 'h') {  // hexadecimal
        p++;
        base = 16;
    }
    return strtol(p, NULL, base);
}