У меня возникла проблема при использовании strcat, однако при использовании realloc strcat перезаписывает строку назначения.
char *splitStr(char *line) {
char *str_;
str_ = (char *) malloc(1);
char *ptr = strtok(line,"\n");
int a;
while (ptr != NULL) {
if (ptr[0] != '$') {
printf("oncesi %s\n", str_);
a = strlen(ptr) + strlen(str_) + 1;
str_ = realloc(str_, a);
strcat(str_, ptr);
str_[a] = '\0';
printf("sontasi:%s\n", str_);
}
ptr = strtok(NULL, "\n");
}
printf("splitStr %d\n", strlen(str_));
printf("%s", str_);
return str_;
}
и мое входное значение ;
*4
$3
200
$4
4814
$7
SUCCESS
$4
3204
поэтому я хочу разделить это входное значение через strtok; стрток(строка,'\n');
и объединить всю строку без начального символа "$" с новым символом. Однако этот код дает следующий вывод;
line: *4
oncesi
sontasi:*4
oncesi *4
200tasi:*4
200esi *4
4814asi:*4
4814si *4
SUCCESS:*4
SUCCESS*4
3204ESS:*4
splitStr 25
кажется, перезаписывает исходную строку. у вас есть идеи, почему эта проблема может произойти?
\r
- person Chris Turner   schedule 07.01.2020str_
используется, когда память, на которую он указывает, не инициализирована - person 4386427   schedule 07.01.2020str_[a]='\0';
пишет вне выделенной памяти - person 4386427   schedule 07.01.2020str_[a] = '\0';
неверно, так как выходит за пределы выделенной памяти. Это должно было бытьstr_[a-1] = '\0';
(но это необязательно, потому что этим занимаетсяstrcat
). Предполагается, что строкаstr_
не инициализирована и вызывает неопределенное поведение, когда поток программы впервые входит в блокif
. Он должен быть инициализирован какstr_[0] = '\0';
сразу послеmalloc
. - person Lxer Lx   schedule 07.01.2020str_[0] = 0;
сразу после malloc. - person Serge   schedule 07.01.2020