我实际上应该动态存储一个string
。我已经尝试过以下
它正在打印所有内容,但是只要我的输入中包含空格,它就会终止。有人可以解释为什么吗?
还有什么正确的方法:
int i;
char *a;
a=(char *)malloc(sizeof(char));
scanf("%s",a);
for(i=0;*(arr+i)!='\0';i++)
printf("%c",*(arr+i));
答案 0 :(得分:3)
它正在打印所有内容,但会终止...
考虑您的内存分配语句:
char *a;
a=(char *)malloc(sizeof(char));
通过仅向缓冲区sizeof(char)
分配a
个字节,然后尝试向其中写入除空终止符以外的任何内容,您正在调用 undefined behavior 。 (请注意:根据定义,C中的sizeof(char)
始终等于1
)
C字符串是 defined as a null terminated character array 。您只分配了一个字节。唯一合法的C字符串可能是仅包含空终止字节的字符串。但是您的代码会尝试编写更多内容,从而侵犯了您的进程不拥有的内存位置。因此,通常,在创建字符串时,请遵循两个简单的规则:
max length
max length + 1
字节以容纳终止字节。 例如,如果最大字符串的长度为x
个字符,则为x + 1
个字符创建内存:
char inputStr[] = {"This string is x char long"};
char string = malloc(strlen(inputStr) +1); //+1 for null byte
strcpy(string, inputStr);
请注意,在C语言中,它是 not recommended to cast the return of malloc() 及其家族。
答案 1 :(得分:1)
您的代码有两个问题。首先,您只能为1个字符分配足够的空间,并且由于字符串必须以NUL终止,因此您可以拥有的最长字符串为0个字符。由于您不知道要读多长时间,因此可以从任意大小(例如1024)开始。
a=malloc(1024);
第二,scanf
仅在您使用“%s”时才读取下一个空格。也不受a
中可用空间的限制。阅读整行文本的一种更好的方法是像这样使用fgets
fgets(a,1024,stdin);
这将最多读取1023个字符或最多(包括下一个换行符)。它将同样为您终止字符串。
然后可以将其打印为字符串。
printf("%s",a);
答案 2 :(得分:0)
char *a;
/* Initial memory allocation */
a = (char *) malloc(1024); // your buffer size is 1024
// do something with a
free(a);
将波纹管字符串复制到您的变量中,然后以"%s"
作为字符串打印该字符串,而无需使用"%c"
:
strcpy(a, "this is a string");
printf("String = %s", a);
不要忘记使用free()
,如果不使用它,则会出现内存泄漏问题。