Мне трудно понять, почему я продолжаю получать ошибку сегментации при попытке запустить небольшой тест. Идея состоит в том, что я отправляю дробь в виде строки, такой как «1/4» в этом случае, а string_to_fraction должен токенизировать строку, избавляясь от «/» и устанавливая значение числителя равным 1, а значение знаменателя до 4, а затем вернуть его.
typedef struct {
int numer;
int denom;
}Fraction;
Fraction string_to_fraction(const char *S);
main(){
const char* strn = "1/4";
Fraction myFrac;
myFrac = string_to_fraction(strn);
return 0;
}
Fraction string_to_fraction(const char *S)
{
Fraction result = {0,1};
char *p;
char n[100] = {}, d[100] = {};
p = strtok(S,"/");
if(p == NULL){
printf("String of improper format");
return result;
}
strcpy(n,p);
p = strtok(NULL,"/");
strcpy(d,p);
result.numer = n;
result.denom = d;
return result;
}
segfault возникает в первом экземпляре strtok, например. p = strtok(S,"/");
, но я понятия не имею, почему это происходит, я пробовал передать много разных вещей в функцию string_to_fraction, но она всегда дает сбои. Любое понимание очень ценно, так как все другие проблемы, которые люди имели с strtok, вызывающим segfault, на самом деле не относятся к моей ситуации, насколько я могу судить.
изменить: забыл включить мое объявление в функцию Fraction_to_string здесь, которая теперь исправлена. Я сделал это в своем коде, но этот код разделен большим количеством мусора, поэтому я просто переписал его здесь.
char *scpy = strdup(S);
, затем вызвалp = strtok(scpy,"/");
, затем вызвалfree(scpy);
непосредственно перед возвратом. Раньше я даже не задумывался о том, что строки не являются целыми числами, поэтому упоминание atoi спасло меня от многих страданий в будущем. 12.04.2015