1

だから、私はCが初めてで、文字列処理を独学しています。私が知る限り、私の問題は、spをトークン化する私の関数ですか?数字の入力文字列は、スペースを切断しているだけではありません。たとえば、45 のような数値を入力すると、配列内の結果の文字列には 45 と 5 の両方が表示されるため、2 桁の数値では何らかの理由で数値が分割されます。私は長々と検索しましたが、運がありませんでした。

うまくいけば、私が見落としているのは明白なエラーではありません。しかし、学習を続けることができないところまで来てしまったので、助けていただければ幸いです。

出力例:

please enter your string: 1 45 30 82
converting strings to ints
Printing the string
 1, 0, 45, 5, 0, 30, 0, 0, 82, 2,
Press any key to continue . . .

私のコード:

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

#define STRING_LENGTH 81
#define MAX_TOKENS 40

int StrInput( char dataStr[]);
void atoiWorker( char dataStr[], char results[], int idx);
void printer ( char dataStr[], int idx);
void tokenize ( char dataStr[], char results[]);

int main()
{
    int idx;
    char dataStr[STRING_LENGTH];
    char results[STRING_LENGTH];
    idx = StrInput(dataStr);
    tokenize(dataStr, results);
    atoiWorker(dataStr, results, idx);
    printer(results, idx);
}

int StrInput(char dataStr[])
{
    int idx = 0;
    printf( "please enter your string: " );
    while (idx < (STRING_LENGTH) && ((dataStr[idx] = getchar()) != '\n'))
        idx++;

    dataStr[idx] = '\0';
    return idx;
}

void atoiWorker( char dataStr[], char results[], int idx)
{
    int i;
    printf( "converting strings to ints\n" );
    for (i = 0; i < idx; i++)
        results[i] = atoi(&dataStr[i]);
}

void tokenize(char dataStr[], char *results[])
{
    int count = 0;
    char delim[] = " ,\t\n"; //found this on msdn, hopefully it's right

    if (results[0] = strtok(dataStr, " \t"))
        count++;

    while (results[count] = strtok(NULL, delim/*" \t"*/))
        count++;
}

void printer(char dataStr[], int idx)
{
    int i;
    printf( "Printing the string\n" );
    for (i = 0; i < idx; i++)
        printf( " %d,", dataStr[i] );
    printf( "\n" );
}
4

2 に答える 2

1

このように修正

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

#define STRING_LENGTH 81
#define MAX_TOKENS 40

void StrInput( char dataStr[]);
void atoiWorker( char *tokens[], int results[], int idx);
void printer ( int results[], int idx);
int tokenize ( char dataStr[], char *results[]);

int main()
{
    int idx;
    char dataStr[STRING_LENGTH];
    char *tokens[MAX_TOKENS];
    int results[MAX_TOKENS];
    StrInput(dataStr);
    idx = tokenize(dataStr, tokens);
    atoiWorker(tokens, results, idx);
    printer(results, idx);
}

void StrInput(char dataStr[])
{
    int idx = 0;
    printf( "please enter your string: " );
    while (idx < (STRING_LENGTH) && ((dataStr[idx] = getchar()) != '\n'))
        idx++;

    dataStr[idx] = '\0';
}

void atoiWorker( char *tokens[], int results[], int idx)
{
    int i;
    printf( "converting strings to ints\n" );
    for (i = 0; i < idx; i++)
        results[i] = atoi(tokens[i]);
}

int tokenize(char dataStr[], char *results[])
{
    int count = 0;
    char delim[] = " ,\t\n"; //found this on msdn, hopefully it's right

    if (results[0] = strtok(dataStr, " \t"))
        count++;

    while (results[count] = strtok(NULL, delim/*" \t"*/))
        count++;
    return count;
}

void printer(int result[], int idx)
{
    int i;
    printf( "Printing the string\n" );
    for (i = 0; i < idx; i++)
        printf( " %d,", result[i] );
    printf( "\n" );
}
于 2013-04-23T00:56:44.653 に答える
1

に設定results[]tokenize()たら、 に上書きしますatioWorker()

于 2013-04-23T00:00:51.180 に答える