【问题标题】:Tokenized string of char to ints using atoi使用 atoi 将 char 的标记化字符串转换为 int
【发布时间】:2012-10-13 00:45:03
【问题描述】:

我正在尝试获取用户输入:(1 345 44 23) 并将其转换为标记化的字符字符串,然后转换为整数。令人惊讶的是,对于我认为常见的任务,我找不到太多帮助。

任何想法如何使用标记将 char 字符串转换为 in 字符串?

我的程序在进行转换时崩溃(在标记化之后 [我意识到这不是一个词])。

谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define StrSZE 81


void strInput (char str[], int maxChars);
void custatoi(char * tokenArray[], int * data, int numOfTok);


int main(int argc, char *argv[])
{
    char str[StrSZE];
    char* tokenArray;
    int maxChars=StrSZE-1, cont=1, numOfToken=0, i=0;
    int* data;


    strInput(str, maxChars);


    tokenArray = strtok(str, " \t");
    while (tokenArray)
    {
        printf("token: %s\n", tokenArray);
        tokenArray = strtok(NULL, " \t");
        numOfToken++;
    }


    data = (int *) malloc(numOfToken * sizeof(int));

    custatoi(tokenArray, data, numOfToken);

    system("PAUSE");
    return 0;
}



void strInput (char str[], int maxChars)
{
    char garbage;
    int k=0;

    str[0]='\0';

    printf("Please type a string of whole numbers (intigers).\n\n");

    while ((k<80) && ((str[k] = getchar()) != '\n'))
        k++;

    /* Clears the keyboard buffer.  */
    if (k==80)
        while((garbage = getchar()) != '\n')
            ;

    /* Place null at the end of the line read in from user */
    str[k]='\0';

    printf("str after input is: %s\n\n", str);
}


void custatoi(char * tokenArray[], int * data, int numOfTok)
{
    int i;

    for (i=0; i < numOfTok; i++)
        data[i] = atoi(tokenArray[i]);
}

【问题讨论】:

    标签: c char token tokenize atoi


    【解决方案1】:

    我纠正了你代码中的错误:有一些mistakes in main(), tokenArray data type was not correct.

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    #define StrSZE 81
    
    
    void strInput (char str[], int maxChars);
    void custatoi(char*  tokenArray[], int * data, int numOfTok);
    
    
    int main(int argc, char *argv[])
    {
        char str[StrSZE];
    
    
        int maxChars=StrSZE-1, cont=1, numOfToken=0, i=0;
        int* data;
        char* tokenArray[50];    // Declared correctly 
    
        strInput(str, maxChars);
    
    
        tokenArray[i] = strtok(str, " \t");   // Also made a change here!
        while (tokenArray[i])
        {
            printf("token: %s\n", tokenArray[i]);
            i++;
            tokenArray[i] = strtok(NULL, " \t");
            numOfToken++;
        }
    
    
        data = (int *) malloc(numOfToken * sizeof(int));
    
        custatoi(tokenArray, data, numOfToken);
    
        printf("data\n");
        for(i=0;i<numOfToken;i++){
            printf(" %d\n",data[i]);
    
        }
    
        system("PAUSE");
        return 0;
    }
    
    
    
    void strInput (char str[], int maxChars)
    {
        char garbage;
        int k=0;
    
        str[0]='\0';
    
        printf("Please type a string of whole numbers (intigers).\n\n");
    
        while ((k<80) && ((str[k] = getchar()) != '\n'))
            k++;
    
        /* Clears the keyboard buffer.  */
        if (k==80)
            while((garbage = getchar()) != '\n')
                ;
    
        /* Place null at the end of the line read in from user */
        str[k]='\0';
    
        printf("str after input is: %s\n\n", str);
    }
    
    
    void custatoi(char*  tokenArray[], int * data, int numOfTok)
    {
        int i;
    
        for (i=0; i < numOfTok; i++)
            data[i] = atoi(tokenArray[i]);
    }
    

    【讨论】:

    • 谢谢! ...有什么错误?
    • 您将 'tokenArray' 声明为 char* 但它必须是 char* tokenArray[] 类型。
    • Alexey Frunze 先生也回答了。
    • 感谢您的友好提醒 :) 并感谢您的洞察力!
    【解决方案2】:

    strtok 循环结束时,tokenArray 将设置为NULL。然后将它传递给custatoi,它可能会在尝试取消引用它时崩溃。

    注意tokenArray 不是字符串数组;它只是一个字符串指针(或指向字符数组的指针)。如果要将令牌累积到一个数组中,则必须为此创建一个单独的数组。

    【讨论】:

    • 所以因为'tokenArray'是一个字符串指针,我不应该像在'custatoi'中那样使用它来制作一个单独的整数数组吗?
    • 嗯,第一个问题是你传递了NULL 而不是一个有效的字符串。第二个问题是字符串指针(char *)只能指向单个字符串——它不能有意义地表示字符串数组(即char **char *[])。在您的情况下,您基本上是将char * 转换为char *[],这是一个很大的禁忌。
    【解决方案3】:

    主要问题是custatoi() 期望使用指向char 的指针数组,而main() 中的tokenArray 仅仅是指向char 的指针。原始代码从不将输入字符串中指向标记的所有指针收集到custatoi() 期望的数组中,原始代码中没有这样的数组。

    请研究固定代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    #define StrSZE 81
    
    void custatoi(char* tokenArray[], int* data, int numOfTok);
    
    int main(void)
    {
        char str[StrSZE];
        char** tokenArray;
        int numOfToken = 0, i;
        int* data;
    
        //strInput(str, maxChars);
        strcpy(str, "1 345 44 23");
    
        tokenArray = malloc(sizeof(char*));
    
        tokenArray[numOfToken] = strtok(str, " \t");
        while (tokenArray[numOfToken] != NULL)
        {
            printf("token: %s\n", tokenArray[numOfToken]);
            numOfToken++;
            tokenArray = realloc(tokenArray, sizeof(char*) * (numOfToken + 1));
            tokenArray[numOfToken] = strtok(NULL, " \t");
        }
    
        data = malloc(numOfToken * sizeof(int));
    
        custatoi(tokenArray, data, numOfToken);
    
        for (i = 0; i < numOfToken; i++)
          printf("data[%d]=%d\n", i, data[i]);
    
        return 0;
    }
    
    void custatoi(char* tokenArray[], int* data, int numOfTok)
    {
        int i;
    
        for (i=0; i < numOfTok; i++)
            data[i] = atoi(tokenArray[i]);
    }
    

    输出(idone):

    token: 1
    token: 345
    token: 44
    token: 23
    data[0]=1
    data[1]=345
    data[2]=44
    data[3]=23
    

    【讨论】:

    • 这提供了很多洞察力。谢谢!
    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多