#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);
}
答案 0 :(得分:1)
你没有告诉我们你看到的问题/症状......但对于初学者来说......
name[i] != '\0'
而不是i != '\0'
strlen(name)
返回的长度不包括尾随null
。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)
您没有为y
分配足够的内存。您需要为字符串中的字符数分配空间,再为null终止字符分配一个空格。
y = malloc(size + 1);
您的循环条件已被破坏。您可能希望比较字符串中的第i个值:
for (i=0; name[i]!='\0'; i++) {
您应该只写*(y+i)
而不是撰写y[i]
。它更容易理解,并且具有完全相同的语义。
for (i=0; name[i]!='\0'; i++) {
y[i] = name[i];
}
您没有终止y
。
y[size] = '\0';
打印字符串时,参数应为char *
,而不是char
。所以:
printf("%s", y);