我正在尝试逐个将字符添加到字符串中。我有这样的事情:
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
所以输出显示字符串搞砸了。按字符构建此字符串的最佳方法是什么?我的字符串操作是否正确?
非常感谢任何帮助!
谢谢!
答案 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!!
$
基本假设很少:
传入字符串的长度假定为常量。这可以动态完成 - 请检查一下 - How to read a line from the console in C?。
令牌数组的长度也被假定为常量。这也可以改变。我会留给你找出方法!
希望这有帮助!