Язык C: новый перевод кода из javascript в C, код включает в себя malloc, strncpy, указатели
Я конвертирую (из javascript) программу, которая будет принимать строку переменной длины (но всегда меньше 100 символов) и возвращать данные, содержащиеся в строке, в отдельных переменных. Это первая часть моего кода, и, очевидно, я новичок в C и программировании в целом. Этот код предназначен для первого раздела кода, но изучение того, как правильно его кодировать, даст мне знать, как кодировать все остальное.
Я нуждаюсь:
- первые 4 цифры должны быть сохранены как 'stringID'
- 5-я цифра должна быть сохранена как "myindicator"
- цифры от 6 до (индикатор + 6), которые должны быть сохранены как 'var1'
Пример ввода:
"+12345678901234567890123"
Пример вывода:
- stringID = 1234
- myindicator = 5
- var1 = 67890123456
Когда я запускаю программу, она возвращает "String ID: H>a", и затем программа падает. Любая помощь будет оценена. Нет, это не домашняя работа.
int main()
{
char mystring[100];
char *stringID;
int nep;
int *myindicator;
char *var1;
nep = 0;
printf("Please enter your CODE\n");
scanf("%s", &mystring);
stringID = (char *)malloc(4 * sizeof(char));
if(NULL != stringID)
{
strncpy(stringID, mystring, 4);
stringID[4] = '\0';
free(stringID);
nep = nep +4;
printf("stringID: %s\n",myindicator);
}
if(NULL != myindicator)
{
strncpy(myindicator, (mystring+nep, 1);
nep++;
myindicator = *myindicator - '0';
printf("Indicator : %d\n",myindicator);
}
var1 = (char *)malloc((nep + 6) * sizeof(char));
if(NULL != var1)
{
strncpy(var1, mystring+nep, (myindicator+nep+6));
var1[myindicator+nep+6] = '\0';
free(var1);
printf("Var 1: %s", var1);
nep = nep +myindicator+6;
}
getchar();
return 0;
}
2 ответа
Я что-то исправил, найди это в комментариях. Но вы должны проверить руководство по языку C...!
int main()
{
char mystring[100];
char *stringID;
int nep;
// Changed to integer, not pointer to int.
int myindicator;
char *var1;
nep = 0;
printf("Please enter your CODE\n");
/*
This scanf is a bad idea for the same reason for which, below, we take
care to allocate memory enough for whatever we have to do.
Should someone input 250 characters in a buffer of size 100, those 150
extra characters would wreak havoc and possibly endanger the system.
*/
// scanf("%s", &mystring);
fgets(mystring, sizeof(mystring)-1, stdin);
// fgets will read at most "sizeof(mystring)-1", that is, 99 bytes,
// from "stdin" (STanDard INput), the same as scanf. But it will halt
// when reaching the limit given. It's up to us to give a "real" limit
// (nothing stops you from saying 15000 -- even if the true value is 100).
// C strings are made of characters, terminated by a zero byte.
// So you need 5 here, to store 4 characters
stringID = (char *)malloc(5 * sizeof(char));
if (NULL == stringID)
{
// Serious out of memory error: no sense going on.
// fprintf(stderr, "Out of memory\n");
abort();
}
strncpy(stringID, mystring, 4);
stringID[4] = '\0';
printf("ID: %s\n", stringID);
free(stringID);
nep = nep + 4;
printf("NEP: %d\n", nep);
// Now we want to decode the fifth digit.
// I use '0' as character. So if the fifth digit is '0', '0'-'0' will give 0
// and if it is '9', '9'-'0' will give 9 (the number).
// The trick does not work with more than one digit, of course.
myindicator = mystring[nep] - '0';
// Had I wanted to read 3 digits, I would have had to copy them into a
// temporary buffer, add a zero in the fourth position, then run atol()
// on the resulting buffer: atol("12345\0" /* A STRING */) = 12345 /* A NUMBER */;
printf("VLI : %d\n", myindicator);
// Copy "myindicator" bytes, so alloc myindicator+1 chars
var1 = (char *)malloc((myindicator + 1) * sizeof(char));
// Check that var1 is not null and abort if it is
if (NULL == var1)
abort();
strncpy(var1, mystring + 6, myindicator);
var1[myindicator+1] = '\0';
// Moved this printf before the free. See why below.
printf("Prefix : %s\n", var1);
// NEVER use a variable after you freed it!!!
// it might APPEAR to work, but will stab you in the back the first chance it gets.
// Good if paranoid habit: null a var as soon as you've freed it.
free(var1); var1 = NULL;
getchar();
return 0;
}
Почему вы освобождаете свой массив? вы ссылаетесь на них после того, как освободили их из кучи.
Ваш код будет segfault в этих местах:
где вы разместили
myindicator
?strncpy (myindicator, (mystring + nep, 1); // здесь будет происходить ошибка.
бесплатно (var1);
printf ("Префикс: %s", var1); // снова segfault
Опять здесь
strncpy(var1, mystring+nep, (myindicator+nep+6)) // где ваша mystring?
принимая строку ввода
scanf()
это ужасная ужасная идея. использовать буферизованный ввод-вывод какfgets()
,Вы выставляете свои
mystring
для переполнения буфера. кто мешает пользователю ввести 120-байтовую строку? я могу написать свой стек с осторожной инструкцией перехода на мой вредоносный код.