2013-04-22 31 views
1

所以我是C的新手,并且在自学字符串处理。就我所能说的而言,我的问题是我的函数标记sp?输入的数字串不仅在空间上劈开。例如:如果我输入的数字是45,那么数组中的结果字符串将显示45和5,所以在两位数字中,无论出于何种原因,它都会分割数字。我搜查了很长时间,但没有任何运气。strtok只在指定的分隔符上不能标记

希望这不是一个明显的错误,我只是俯瞰。但是我已经达到了无法继续学习的地步,所以我们不胜感激!

输出示例:

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"); 
} 
+0

显示的完整代码。 – 2013-04-22 23:48:16

+2

这段代码如何编译? “结果”的实际类型是什么?您正在将整数,字符指针和字符分配给它在不同位置的元素。 – perreal 2013-04-22 23:53:30

+0

它当然不能编译,因为'tokenize'的两个签名不匹配。 – 2013-04-23 01:05:36

回答

1

设置results[]tokenize()你再覆盖它在atioWorker()后。

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"); 
} 
+0

所以这里的主要调整是,我现在有一个单独的数组foratWorker来解决SpacedMonkey的答案,我覆盖了结果数组(为什么这是不好的做法)? (刚刚跑过你的代码,效果很好,我正在努力通过差异) – jschneidereit 2013-04-23 15:16:51

+0

@ t0rqued这是不错的做法。 'tokenize()'在'results []'中存储指向每个数字开头的指针,以便atoiWorker()知道每个数字的起始位置。相反,您的代码一次只能通过一个字符原始字符串(包括NUL)来覆盖所需的数据。 – SpacedMonkey 2013-04-25 05:51:57