我正在尝试规范化包含数字的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已损坏......”错误:(
答案 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。