struct parsedString{ char chunk1[50]; char chunk2[10]; char chunk3[50]; }; main(char* bigstring) { parsedString ps; ps = parseMe(bigString) cout << ps.chunk1 << endl; cout << ps.chunk2 << endl; cout << ps.chunk3 << endl; } parsedString parseMe(char* stringToParse) { char* parseStr = stringToParse; parsedString ps; ps.chunk1 = first x chars; ps.chunk2 = next y chars; ps.chunk3 = last z chars; return ps; }
显然这不是工作代码,我不想抛出所有额外的东西,因为阅读起来会更难,我很确定我的问题是新手c / c ++问题和内存分配问题或类似的......
基本上,当main函数从parsedString打印字符串时,它会打印出我想要的字符串,以及垃圾字符。我正在使用
输入每个数组ps.chunk的值ps.chunk1 [i] = * parseStr
因为 parseStr会让我获得每个角色。我无法弄清楚垃圾字符的来源,它是否与我访问大字符串的方式有关?最初我在结构中使用了char 而不是数组,当我从parseMe()函数中打印出来时,它们会很棒但是当我从main函数访问它时它们会变成乱码。非常感谢任何帮助。非常感谢。
如果有什么不清楚的地方,请告诉我,我会尽力详细说明。
答案 0 :(得分:6)
目前尚不清楚为什么要在'\0'
终止时尝试执行此操作
字符串,当C ++具有完全可用的字符串类时,但是
假设一些教学原因:是你的字符串'\0'
终止?如何提取和复制第一个x字符
ps.chunk1?你如何确保它有一个'\0'
?
如果你真的想要获得n个字符,你必须:
assert(strlen(parseStr) >= n);
,将它们复制到目标中(必须包含至少n + 1个字符),
memcpy(ps.chunk1, parseStr, n);
,并添加最终'\0'
:
ps.chunk1[n] = '\0';
(当然,提前parseStr
:parseStr += n;
)
或者您可以在任何地方使用std :: string,然后编写 类似的东西:
ps.chunk1(stringToParse.substr(startPosition, length));
答案 1 :(得分:1)
正如其他人所指出的,您应该使用std::string
来表示字符串,并为自己省去所有麻烦。这看起来像这样:
struct parsedString{
std::string chunk1;
std::string chunk2;
std::string chunk3;
};
parsedString parseMe(const std::stirng & stringToParse) {
parsedString result;
// just an example - this assigns the first two characters of stringToParse
// to chunk1
result.chunk1 = stringToParse.substr(0, 2);
// get the other chunks
return result; // return the result
}
以上代码应说明用法。您可以在std::string
here找到更多相关信息。
答案 2 :(得分:1)
由于几个原因,这可能会发生。
当您声明parsedString ps;
时,最好初始化结构并确保您正在接收干净的内存块以供使用。parsedString ps = {0};
某些平台不会这样做而且它是在使用前将内存归零。
char*
字符串必须以\0
字符结尾。此字符表示char *的结尾。这是强制性的!不将其插入字符串的末尾最有可能使打印操作(例如)显示超出数组限制的内容,从而为您提供垃圾字符。这可以通过将我所建议的所有结构归零来自动实现。