强制打印垃圾字符

时间:2018-12-08 09:22:35

标签: c string character

这是一个程序,应该读取输入,数字“ 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;
}

试运行: Test run.

2 个答案:

答案 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;
}