字符串和malloc ...什么出错了?

时间:2014-11-19 21:51:55

标签: c string malloc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

    int i, *x , size ;
    char name[100] , *y;

    printf("Give name: ");

    /* user gives name */
    gets(name);
    size = strlen(name);


    /* gets memory for exactly the name length */
    y=(char*)malloc(size*sizeof(char));

    for(i=0;i!='\0';i++) {

        /* corywrites the name */
        *(y+i)=name[i];
    }

    printf("%s" ,*y);
}

3 个答案:

答案 0 :(得分:1)

你没有告诉我们你看到的问题/症状......但对于初学者来说......

  • 测试name[i] != '\0'而不是i != '\0'
  • strlen(name)返回的长度不包括尾随null
  • {li>在y循环之后终止for

因此...

y=(char*)malloc((size + 1) * sizeof(char));

for(i=0; name[i] != '\0'; i++) {    
    /* copywrites the name */
    y[i] = name[i]; /* changed to array syntax */
 }
 y[size] = '\0';

 printf("%s", y);

答案 1 :(得分:0)

如果我手工复制一个字符串,它看起来像是:

int i;
for( i = 0; source[i]; i++ ) dest[i] = source[i]; // copy characters
dest[i] = 0; // append null terminator

分配字符串时,需要为null终止符添加1,并在复制字符串后,还需要添加空终止符。

您在将i'\0'进行比较时遇到问题,这是初始条件并立即终止。

复制字符串的一种简单方法是使用strcpy函数。

答案 2 :(得分:0)

  1. 您没有为y分配足够的内存。您需要为字符串中的字符数分配空间,再为null终止字符分配一个空格。

    y = malloc(size + 1);
    
  2. 您的循环条件已被破坏。您可能希望比较字符串中的第i个值:

    for (i=0; name[i]!='\0'; i++) {
    
  3. 您应该只写*(y+i)而不是撰写y[i]。它更容易理解,并且具有完全相同的语义。

    for (i=0; name[i]!='\0'; i++) {
        y[i] = name[i];
    }
    
  4. 您没有终止y

    y[size] = '\0';
    
  5. 打印字符串时,参数应为char *,而不是char。所以:

    printf("%s", y);