C 垃圾字符被强制打印

C 垃圾字符被强制打印,c,string,character,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

这是一个程序,它应该读取输入,一个数字'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;
}
试运行: C中的字符串是字符数组,其中字符\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;
}
C中的字符串是字符数组,其中字符\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;
}

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的返回指针。

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指针。

您的create\u string函数没有创建字符串。我看不到测试运行pic。create\u string函数没有创建字符串。我看不到测试运行pic。@KeineLust看起来我错过了那一点。谢谢按字符大小进行多次编译是毫无意义的。它的定义是1。@melpomene保留是无害的,有时可能对初学者的可读性有益。就个人而言,对于初学者来说,我认为最好显示您正在根据所需元素的数量1设置适当的大小;和2对象或变量的类型大小。从这个角度来看,它可能弊大于利。请记住,我们始终可以使用sizeof*dup。还有一个免费电话丢失了。@KeineLust看起来我错过了那一点。谢谢按字符大小进行多次编译是毫无意义的。它的定义是1。@melpomene保留是无害的,有时可能对初学者的可读性有益。就个人而言,对于初学者来说,我认为最好显示您正在根据所需元素的数量1设置适当的大小;和2对象或变量的类型大小。从这个角度来看,它可能弊大于利。请记住,我们始终可以使用sizeof*dup。还有一个丢失的免费电话。