【问题标题】:C language, char=char with unexpected resultsC语言,char=char,结果出乎意料
【发布时间】:2014-07-10 19:24:57
【问题描述】:

大家好,提前感谢您的帮助,情况如下:

#define N 12
[..]
char vect[N][2];
char strng[2];
[..]
vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
vect[i][2]=strng[0];

现在,如果在string[2] 我有"c 2",我期望在vect[i][0] 中是'2'vect[i][1] 'c'

我使用code::blocks 并观看vect 我有"2@",但也可能是"2À"

你能帮帮我吗?我哪里错了?

【问题讨论】:

  • 行为未定义的原因是因为当索引超出范围时,内存中的该位置可能有一些东西。你得到了一些东西,但你永远无法事先知道是什么。

标签: c vector matrix codeblocks


【解决方案1】:

数组索引从零到大小减一。所以使用例如strng[2] 您访问了 第三个​​ 条目在两个条目数组中。越界访问数组会导致undefined behavior,并且数据将是不确定的。

您还应该记住,C 中的所有字符串都比例如报告的多一个字符。 strlen,而那个额外的字符是一个特殊的终止符。所以如果你想要一个两个字符的字符串,你真的需要三个字符:两个用于字符串,一个用于终止符。

【讨论】:

    【解决方案2】:

    重写这些语句

    vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
    vect[i][2]=strng[0];
    

    以下方式

    vect[i][0]=strng[1]; //this two lines are in a simple for cycle 
    vect[i][1]=strng[0];
    

    假设字符串包含两个字符 { 'c', '2' }。

    考虑到数组字符串不能有字符串文字"c 2",因为你将它定义为

    char strng[2];
    

    也就是说它只能包含两个字符。

    如果您希望该数组确实包含"c 2",那么您必须将其定义为

    char strng[3];
    

    或作为

    char strng[4];
    

    如果你想包含终止零。

    在这种情况下你可以写

    vect[i][0]=strng[2]; //this two lines are in a simple for cycle 
    vect[i][1]=strng[0];
    

    【讨论】:

      【解决方案3】:

      假设 strng 字面上包含“c 2”,那么你的记忆就是问题所在。 strng[2] 包含 3 个单元格 iirc。 2 用于保存字符,然后是空终止符(即 \0)。因此,当您尝试访问 strng[2] 时(您不能访问,因为您只能转到 N-1 个单元格,其中 N 是为其分配的数字)它包含未定义的结果,因为它不是以空值终止的,并且您正在超越你分配的内存

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-16
        • 2021-03-25
        • 2016-09-03
        • 1970-01-01
        • 2014-02-13
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多