C中的字符串输入和输出

时间:2011-02-02 09:51:34

标签: c string

我有这段代码:

char* receiveInput(){
    char *s;
    scanf("%s",s);

    return s;
}

int main()
{
    char *str = receiveInput();
    int length = strlen(str);

    printf("Your string is %s, length is %d\n", str, length);

    return 0;
}

我收到了这个输出:

Your string is hellàÿ", length is 11

我的意见是:

helloworld!

有人可以解释为什么,以及为什么这种编码风格很糟糕,提前谢谢

3 个答案:

答案 0 :(得分:20)

答案 1 :(得分:11)

scanf不为您分配内存。

您需要为传递给scanf的变量分配内存。

你可以这样做:

char* receiveInput(){
    char *s = (char*) malloc( 100 );
    scanf("%s",s);
    return s;
}

但警告:

  1. 调用receiveInput的函数将获取返回内存的所有权:在free(str)中打印后,您必须main。 (以这种方式取消所有权通常不被视为一种好的做法)。

    一个简单的解决方法是将分配的内存作为参数。

  2. 如果输入字符串长于99(在我的情况下),程序将遭受缓冲区溢出(这就是它已经发生的事情)。

    一个简单的解决方法是将缓冲区的长度传递给scanf

    scanf("%99s",s);
    
  3. 固定代码可能是这样的:

    // s must be of at least 100 chars!!!
    char* receiveInput( char *s ){
        scanf("%99s",s);
        return s;
    }
    int main()
    {
        char str[100];
        receiveInput( str );
        int length = strlen(str);
    
        printf("Your string is %s, length is %d\n", str, length);
    
        return 0;
    }
    

答案 2 :(得分:2)

您必须首先在receiveInput()方法中为您的s对象分配内存。如:

s = (char *)calloc(50, sizeof(char));