C语言:将代码从javascript转换为C语言的新手,代码包括malloc、strncpy和指针



我正在转换(从javascript)一个程序,该程序将采用可变长度的字符串(但始终低于100个字符),并以单个变量的形式返回字符串中包含的数据。这是我代码的第一部分,很明显,我对C和编程是个新手。这段代码是针对代码的第一部分,但学习如何正确编码这将使我知道如何编码其余部分

我需要:

  • 要存储为"stringID"的前4位数字
  • 要存储为"myindicator"的第5位数字
  • 存储为"var1"的第6位至(指示符+6)位数字

示例输入:

'12345678901234567890123'

示例输出:

  • 字符串ID=1234
  • myindicator=5
  • var1=67890123456

当我运行程序时,它返回"字符串ID:H>a",然后程序崩溃。如有任何帮助,我们将不胜感激。不,这不是家庭作业。

int main()
{
char mystring[100];
char *stringID;
int nep;
int *myindicator;
char *var1;

nep = 0;
printf("Please enter your CODEn");
scanf("%s", &mystring);
stringID = (char *)malloc(4 * sizeof(char));
if(NULL != stringID)
{
    strncpy(stringID, mystring, 4);
    stringID[4] = '';
    free(stringID);
    nep = nep +4;
    printf("stringID: %sn",myindicator);
}

if(NULL != myindicator)
{
    strncpy(myindicator, (mystring+nep, 1);
    nep++; 
    myindicator = *myindicator - '0';
    printf("Indicator : %dn",myindicator);
}
var1 = (char *)malloc((nep + 6) * sizeof(char));
if(NULL != var1)
{
    strncpy(var1, mystring+nep, (myindicator+nep+6));
    var1[myindicator+nep+6] = '';
    free(var1);
    printf("Var 1: %s", var1);
    nep = nep +myindicator+6;
}
getchar();
return 0;
}

我修复了一些问题,可以在注释中找到。但你需要查看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 CODEn");
   /*
       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 memoryn");
       abort();
   }
   strncpy(stringID, mystring, 4);
   stringID[4] = '';
   printf("ID: %sn", stringID);
   free(stringID);
   nep = nep + 4;
   printf("NEP: %dn", 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" /* A STRING */) = 12345 /* A NUMBER */;
   printf("VLI : %dn", 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] = '';
   // Moved this printf before the free. See why below.
   printf("Prefix : %sn", 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;
}

为什么要释放数组?在将它们从堆中释放出来之后,您正在引用它们。

您的代码将在以下位置出错:

  1. 您在哪里分配了myindicator

    strncpy(myindicator,(mystring+nep,1);//它将在这里断开。

  2. free(var1);

    printf("前缀:%s",var1);//再次分段

  3. 再次点击此处

    strncpy(var1,mystring+nep,(myindicator+nep+6))//你的mystring在哪里?

  4. 用CCD_ 2输入字符串是个可怕的想法。使用类似CCD_ 3的缓冲IO。

  5. 您正在将mystring暴露在缓冲区溢出中。谁在阻止用户输入120字节的字符串?我可以用小心的跳转指令来编写我的恶意代码。

相关内容

  • 没有找到相关文章

最新更新