字符串中出现的随机字符?

时间:2011-12-08 22:45:53

标签: c char

我正在尝试规范化包含数字的C字符串,以便在开头添加额外的零,使整个字符串包含MAXCOL字符(即8 ..)

一切似乎工作正常,直到我将原始字符串添加回规范化字符串:一些随机字符被添加idk如何,就像我添加\0字符后面的字符,使字符串在屏幕上显示时看起来很奇怪。

我希望有人知道我做错了什么。

为了给你一个想法,t_operande2D是一个char [MAXCOL]的二维数组

void normaliser_operandes(t_operande2D mes_operandes){
    // This procedure adds zeros to the beginning of each mes_operandes to have a normalized nbr of MAXCOL chars
    // 
    // Lets say it receives mes_operandes[0] as 10, it will convert it to 00000010

    int j, nombre_caracteres; // Nbr of original caracters
    t_operande2D operandes_normalises; // The normalized output (temp variable)

    for(int i=0; i<MAXLIGNE; i++){
        // Count the original nbr of chars
        nombre_caracteres = 0;
        for(int j=0; (j<MAXCOL && mes_operandes[i][j]!='\0'); j++){
            nombre_caracteres++;
        }
        // Add needed 0s to the beginning
        for(j=0; j< MAXCOL - nombre_caracteres; j++){
            operandes_normalises[i][j] = '0';
        }
        operandes_normalises[i][j] = '\0';

    strncat(operandes_normalises[i], mes_operandes[i], nombre_caracteres);

    strncpy(mes_operandes[i], operandes_normalises[i], MAXCOL);
    }
}
编辑:在编辑之后,strncat给了我“堆栈的operandes_normalises已损坏......”错误:(

1 个答案:

答案 0 :(得分:4)

strcat期望它的两个参数都被NUL终止。根据事物的外观,operandes_normalises[i]MAXCOL - nombre_caracteres '0' char s的数量开头,但未跟进NUL终结符('\0')表示字符串的结尾。

在将strcat追加到mes_operandes[i]之前,

operandes_normalises[i]会查找字符串的结尾。如果垃圾字符介于'0'mes_operandes[i]之间,那么这就是您的问题 - operandes_normalises[i]缺少终结符。

如果垃圾字符在mes_operandes[i]之后,则mes_operandes[i]是未终止NUL的字符。

在将operandes_normalises[i]添加到字符串的开头后打印'0'以查看是否是这种情况。根据事物的外观,我猜测它很有可能。

即。如果MAXCOL - nombre_caracteres为5,operandes_normalises[i]可以是:

"00000random_garble\0" /* just so happens to be a '\0' somewhere in memory */

因此,将在垃圾字符后添加mes_operandes[i]

编辑:我想可以补充一下,strcat是不安全的,特别是在这里使用它的方式 - 没有检查以确保mes_operandes[i]适合{{1} }}

请考虑使用operandes_normalises[i],但请注意,它会将 n + 1 字符写入目标。从联机帮助页:

  

如果src包含n个或更多字符,strncat()会将n + 1个字符写入dest(来自src的n加上终止空字节)。因此,dest的大小必须至少为strlen(dest)+ n + 1。