这是一个程序,应该读取输入,数字“ n”和一个字符,然后将该字符复制n次。它工作得很好,但是当我输入一个较大的数字(例如8+)时,它会完美地复制,但最后会添加垃圾值。我不知道为什么要这样做,因为我使用了malloc,并且在内存中为我保存了正好n个块。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* create_string (char ch, int n);
void main ()
{
int n;
char ch;
printf("Enter number for duplicates: ");
scanf("%d",&n);
printf("Enter a letter: ");
scanf(" %c", &ch);
printf("The letter '%c' duplicated %d times is: ",ch,n);
char* ptr=create_string(ch,n);
printf("%s",ptr);
}
char* create_string (char ch, int n)
{
char* dup=(char*)malloc(n*sizeof(char));
int i;
for (i=0; i<n; i++)
{
dup[i]=ch;
}
return dup;
}
试运行:
答案 0 :(得分:2)
C中的字符串与以null终止的字符序列一样简单。这意味着每当您手动创建一个字符串时,都必须始终在末尾附加一个'\0'
,以便其他函数,例如printf
知道它的结尾:
char* create_string (char ch, int n)
{
char* dup = malloc((n+1) * sizeof(char));
int i;
for (i=0; i<n; i++)
{
dup[i]=ch;
}
// This is important
dup[n] = '\0';
return dup;
}
另一个需要注意的细微之处是,因为您需要存储该终止空字符,所以还需要为其保留空间。因此,malloc
行更改为:
malloc((n+1)*sizeof(char))
// ^^^^^ it's no longer 'n'
在旁注中,您don't need to投射了返回的指针malloc
。
答案 1 :(得分:1)
C中的字符串是char
数组,其中字符\0
表示字符串的结尾。由于您没有显式添加它,因此printf
仅从内存中打印值,直到它碰巧遇到一个终止字符(即,这是未定义的行为)。相反,您应该将此字符显式添加到结果字符串中:
char* create_string (char ch, int n)
{
char* dup = (char*) malloc((n + 1) * sizeof(char));
/* Added 1 for the '\0' char ---^ */
int i;
for (i = 0; i < n; i++)
{
dup[i]=ch;
}
/* Set the terminating char */
dup[n] = '\0';
return dup;
}