C使用已知MAX长度的char构建字符串char

时间:2012-04-25 02:49:26

标签: c string parsing

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

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);

因此,天坑将通过并根据各种条件对其进行标记,并将其片段放入标记。我在变量缓冲区中构建临时字符串为此,我需要逐个字符地查看 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

所以输出显示字符串搞砸了。按字符构建此字符串的最佳方法是什么?我的字符串操作是否正确?

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分: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. 传入字符串的长度假定为常量。这可以动态完成 - 请检查一下 - How to read a line from the console in C?

  2. 令牌数组的长度也被假定为常量。这也可以改变。我会留给你找出方法!

  3. 希望这有帮助!