0

我正在尝试将字符一个一个地添加到字符串中。我有这样的事情:

void doline(char *line, char *buffer, char** tokens){
}

我这样称呼它:

char *line = malloc(1025 * sizeof(char *));
fgets(line, 1024, stdin);
int linelength = strlen(line);
if (line[linelength - 1] == '\n'){
    line[linelength - 1] = '\0';
}

char ** tokens = (char **) malloc(strlen(line) * sizeof(char *));
char *emptybuffer = malloc(strlen(line) * sizeof(char *));

parseline(line, emptybuffer, tokens);

所以 doline 会通过line并根据各种条件对其进行标记,并将其片段放入标记中。我正在变量缓冲区中构建临时字符串为此,我需要逐行遍历。

我目前正在做:

buffer[strlen(buffer)] = line[i];

然后在循环结束时:

*buffer++ = '\0';

但这是结果:

printf("Working on line: '%s' %d\n", line, strlen(line));

输出:在线工作:'test' 4

但是到函数结束时,缓冲区是:

*buffer++ = '\0';
printf("Buffer at the very end: '%s' %d\n", buffer, strlen(buffer));

输出:最后的缓冲区:'test' 7

所以输出显示字符串被弄乱了。逐个字符构建此字符串的最佳方法是什么?我的字符串操作正确吗?

任何帮助将非常感激!

谢谢!

4

1 回答 1

1

有一些基本问题,所以我重新编写了程序。

#include <stdio.h>
#include <stdlib.h>

#define str_len 180

void tokenize(char *str, char **tokens)
{
    int length = 0, index = 0;
    int i = 0;
    int str_i;
    int tok_i;

    while(str[length]) {
        if (str[length] == ' ') {
            /* this charecter is a space, so skip it! */
            length++;
            index++;

            tokens[i] = malloc(sizeof(char) * index);

            tok_i = 0;           
            for (str_i=length-index ; str_i<length; str_i++) {
                tokens[i][tok_i] = str[str_i];
                tok_i++;
            }

            tokens[i][tok_i] = '\0';
            i++;
            index = 0;
        }
        length++;
        index++;
    }       

    /* copy the last word in the string */
    tokens[i] = malloc(sizeof(char) * index);
    tok_i = 0;           
    for (str_i=length-index ; str_i<length; str_i++) {
        tokens[i][tok_i] = str[str_i];
        tok_i++;
    }
    tokens[i][tok_i] = '\0';
    tokens[i++] = NULL;

    return;         
}

int main()
{
    char *str = malloc(str_len * sizeof(char));
    char **tokens = malloc(100 * sizeof(char *));
    int i = 0;

    if (str == NULL || tokens == NULL)
        return 1;

    gets(str);
    printf("input string: %s\n", str);
    tokenize(str, tokens);

    while(tokens[i] != NULL) {
        printf("%d - %s \n", i, tokens[i]);
        i++;
    }

    while(tokens[i])
        free(tokens[i]);
    free(tokens);
    free(str);

    return 0;
}

它的编译和执行如下:

$ gcc -ggdb -Wall prog.c 
$ ./a.out 
this is a test string... hello world!! 
input string: this is a test string... hello world!! 
0 - this  
1 - is  
2 - a  
3 - test  
4 - string...  
5 - hello  
6 - world!!  
$ 

有几个基本假设:

  1. 传入字符串的长度假定为常数。这可以动态完成 - 请检查 -如何从 C 中的控制台读取一行?.

  2. 令牌数组的长度也被假定为一个常数。这也可以改变。我会把它留给你,让你知道怎么做!

希望这可以帮助!

于 2012-04-25T04:07:34.160 回答