我有以下代码:
#include <iostream>
#include <cstdio>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <limits>
#include <functional>
#include <algorithm>
#include <cmath>
#include <string>
#include <ostream>
#include <sstream>
#include <bitset>
#include <numeric>
#include<fstream>
using namespace std;
char str[] = "this.is.a.test";
char str2[] = "this.is.another.test";
typedef struct
{
size_t count;
char** strings;
} Tokens;
Tokens Tokenize(char* String, char Split)
{
Tokens t;
t.count = 1;
for (size_t i = 0; String[i] != 0; i++)
{
if (String[i] == Split)
t.count++;
}
t.strings =(char**) malloc(sizeof(char*)* t.count);
if (t.count > 0)
t.strings[0] = String;
for (size_t i = 0, j = 1; String[i] != 0; i++)
{
if (String[i] == Split)
{
t.strings[j] = &String[i + 1];
String[i] = 0;
j++;
}
}
return t;
}
int main(void)
{
Tokens t = Tokenize(str, '.');
printf("number of strings: %i\n---\n", t.count);
for (size_t i = 0; i < t.count; i++)
{
printf("%i: %s\n", i, t.strings[i]);
}
free(t.strings);
}
问题出在我调试代码时,特别是那行t.strings[j] = &String[i + 1];
在this.is.a.test的测试案例中
答案 0 :(得分:0)
调试器显示的内容在第55行是正确的。已完成分配,因此t.strings[j]
指向点后面。
请注意,在Tokenize
中,您在堆栈上分配Tokens t;
,然后返回此t
。这很糟糕(非常糟糕!)。由于t
位于堆栈中,因此调用printf
会覆盖它。
(虽然大多数是C,但正如C中的C ++,你不能在for
初始化中声明变量,如for (size_t i = 0;
)