在c ++中混淆char数组和指针

时间:2011-03-14 18:31:01

标签: c++ arrays string pointers

嘿大家,谢谢你花时间解决我的问题。在这一点上我看了很多材料,我刚开始变得越来越困惑。基本上,我正在编写一个解析字符串的简单代码段。请理解我的问题不是解析。我使用的是C ++,之前从未使用过C语言并拥有一点c ++经验(入门经验,我还是新手)。

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函数访问它时它们会变成乱码。非常感谢任何帮助。非常感谢。

如果有什么不清楚的地方,请告诉我,我会尽力详细说明。

3 个答案:

答案 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';

(当然,提前parseStrparseStr += 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 *的结尾。这是强制性的!不将其插入字符串的末尾最有可能使打印操作(例如)显示超出数组限制的内容,从而为您提供垃圾字符。这可以通过将我所建议的所有结构归零来自动实现。