来自大学的任务:new_string应复制到next_string->个字符,但只有MAX_STR_LENGTH字符为next_string分配->字符,因此在if语句(36(中剪切新字符串,为字符串添加一个null终止符。只要new_string的长度与MAX_STR_LENGTH相同,并且if语句为true,我就会在第38行出现分段错误。我不明白为什么,因为由于if语句,必须存在并索引MAX_STR_LENGTH-1。还有:strlen不计算\0,所以一切都应该好吗?
22 string* next_string;
23 // (Allokierung und Prüfung des Speichers)
24 // TODO: Implementieren Sie hier Ihre Lösung
25 if((next_string = (string*)malloc(sizeof(string)))==NULL){
26 exit(1);
27 }
28 if((next_string->characters = (char*)malloc(MAX_STRING_LENGTH*sizeof(char)))==NULL){
29 exit(1);
30 }
31 // die Zeichenkette abschneiden
32 int length = strlen(new_string);
33 printf("%d", length);
34 // TODO: Implementieren Sie hier Ihre Lösung um zu lange Zeichenketten
35 // abzuschneiden
36 if(length > MAX_STRING_LENGTH-1){
37 length = MAX_STRING_LENGTH-1;
38 new_string[MAX_STRING_LENGTH-1] = ' ';
39 //snprintf(new_string, , "%s",new_string);
40 }
41
42 next_string->length = length;
43 strncpy(next_string->characters, new_string, length+1/* TODO */);
44
45 return next_string;```
46 }
您没有展示new_string
是如何初始化的,但我敢打赌您有相当于的东西
char *new_string = "abc";
修改由字符串文字产生的字符串是未定义的行为。
删除有问题的行,并使用以下方法将字符串复制到缓冲区:
if ( length >= MAX_STRING_LENGTH )
length = MAX_STRING_LENGTH - 1;
next_string->length = length;
if ( length )
strncpy( next_string->characters, new_string, MAX_STRING_LENGTH - 1 );
next_string->characters[ length ] = 0;
此外,应该将new_string
设置为const char *
,而不是char *
。