将整个字符数组转换为C中的整数

时间:2018-02-17 03:28:47

标签: c

我正在从文件中读取输入并尝试从我接收的字符串中创建数值。

我尝试过简单地使用atoi,但这并不适用于角色。 然后我尝试在我的数组字符上使用forloop,但后来我得到了错误,因为有些字符实际上是整数。 然后我尝试使用if语句检查字符本身是否为整数,并将其添加到我的" sum"手动。

但到目前为止,我得到的只是错误和错误,我不确定我的逻辑错在哪里。

在C中,数组只是一个指针对吗?所以要访问某个索引的值,我使用* arr [num]吧?

这是我的代码

    char newlineC;
    char input[14];
    while(fscanf(fp,"%s%c",input, &newlineC)!=EOF){
        int val = 0;
        int x;
        for(x=0; x<14; x++){
            if(isdigit(*input[x])){
                val = val + input[x];           
            }else{
                int p = atoi(input[x]);
                val = val + p;              
            }
        }

我已经尝试过控制功能......也没有用。我已经这么久了,我感到愚蠢,我被困在一些看起来如此简单的事情上。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

你传遍了错误的类型。

char input[14];

这声明了一个维度为char的数组。input[i]i char个 数组,它有类型char。它不是指针,你不能取消引用它, 这就是*input[x]失败的原因。实际上编译器应该给你一个 错误,这个错误:

invalid type argument of unary ‘*’ (have ‘int’)

atoi同样的问题。它期望指向char的指针指向a 串。 input[x]是单char,您无法转到atoi。再一次 编译器应该警告过你。

fscanf(fp,"%s%c",input, &newlineC)

这非常笨拙。如果输入大于13个字符,您将 溢出缓冲区。更好的方法是:

fscanf(fp, "%13s%c", input, &newline);

甚至更好

int val;
fscanf(fp, "%d", &val);

另一个错误:如果你知道input[x]是一个数字,那么整数就是 数字代表是input[x] - '0'。所以这应该是计算:

val = val + input[x] - '0';

总的来说,我会使用fgetsstrtol

while(fgets(input, sizeof input, fp))
{
    long int val;
    char *tmp;

    val = strtol(line, &tmp, 0);

    if(*tmp == 0 || *tmp == '\n')
        printf("An integer was read: %ld\n", val);
    else
        printf("More than an integer was read: '%s'\n", line);
}

答案 1 :(得分:0)

如果您只是将字符[1..0]转换为整数值,那么您只需

int main(void) {
    char input[14];

    scanf("%s", input);

    if (isdigit(input[0])) {
        int num = atoi(input);
        printf("%d\n", num);
    }
    else {
        printf("INPUT ERROR\n");
    }
}

您是否也希望处理字母字符并将其转换为某个整数值?

答案 2 :(得分:0)

C中的数组基于指针,但并非全部。 C中的数组只是内存中一行中的一堆数据类型。这样你就可以访问前导变量的指针,而不是跳下该列表以获得数组的下一次迭代。

isdigit(*input[14])

此行会导致问题。看看input本身是什么。 input是指向该数组中第一个元素的指针。输入基本上是在说char* input = &array[0];所以假设你取消引用没有那个14的输入变量,你会得到第一个元素。所以我们可以说*input = array[0];你在这里看到了这个问题吗?你基本上解除了它两次。如果您刚刚完成了insdigit(input[14]),那会更好一些。

但是这里涉及更大的问题。你正在使用一个只包含字符的字符数组,而你正在尝试将它们转换为数字。请记住,char和int是两种不同的数据类型。请继续查看此表:https://upload.wikimedia.org/wikipedia/commons/d/dd/ASCII-Table.svg

回想一下,字符基本上只是与该ASCII值对应的数字。例如,您的计算机不会将字母读为D,而是将其读作68(或二进制格式为68)。对于数字它是相同的概念,即使它看起来只是一个数字,你应该能够将它添加到val,你首先必须减去48或使用数字上的atoi函数。

那你能在这做什么?我不能确切地说,因为我不知道你想要做什么,因为我不知道你的具体需求,但只是意识到你已经可以很容易地将char转换成int。我相信你可以添加一个字符到一个int,虽然我可能会弄错(我知道有一个非常简单的方法来添加一个char的值,也许你必须先把它投出来?)但是请记住,如果你想要数字要计算面值,你必须先从它们中减去48。

如果你想使用atoi你可以,但老实说,我没有在这里看到需要,因为你已经在这里将常规字符转换为数字。检查char值是否在48到58之间(或者实际数字是多少)就足够了,如果它们是,那么你可以减去它。

希望这有帮助!