【问题标题】:Pointers, chars and malloc指针、字符和 malloc
【发布时间】:2014-04-12 10:52:56
【问题描述】:

以下代码有问题:

int main(void)
{
char *pointer;
int num, i;
printf_s("Enter number of elements: ");
scanf_s("%d", &num);
pointer = (char*) malloc(sizeof(char) * num);
for (i = 0; i < num; i++, pointer++)
    scanf_s(" %c", pointer);
pointer -= num;
for (i = 0; i < num; i++)
printf_s("%c", *(pointer + i));
free(pointer);
return 0;
}

代码相当简单,我要做的就是打印我刚刚输入的字符。相反,它不打印任何内容/空白。我做错了什么?

【问题讨论】:

    标签: c pointers char scanf


    【解决方案1】:

    变化:

    scanf_s(" %c");
    

    收件人:

    scanf_s("%c");
    

    当你在处理它时(虽然与手头的问题没有直接关系),摆脱malloc

    int main(void)
    {
        char c;
        scanf_s("%c", &c);
        printf_s("%c", c);
        return 0;
    }
    

    【讨论】:

    • 为什么malloc
    • @Ed Heal:是的,就在我提交那条笔记之前找到了我(尽管与问题没有直接关系)。
    • 谢谢,但是如果我想创建一个数组,比如说 n 个元素,我们了解到它的完成方式类似于 'pointer = (char*) malloc (sizeof (char) * n)'。我使用 for 循环输入元素,但问题仍然存在。另外,我希望在 scanf 中有一个指针变量(不是常规变量),以便将我输入的字符放在指针指向的位置,然后打印它。
    • @MoSFeT 你为什么不像这样在堆栈上声明一个数组 char str[N]
    • @MoSFeT,如果您想要一个 n 字符数组(其中 n 仅在运行时计算),那么是的 - 您需要使用 malloc。但是,这里不是这种情况,因为您只有一个字符。关于您的其他问题-scanf 无论如何都需要一个地址(无论您声明char c 并使用&amp;c 调用scanf,或者声明char* p 并使用scanf 调用p)。
    【解决方案2】:

    除了已经给出的建议...

    以下内容来自scanf_s的文档

    与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 需要为 c、C、s、S 类型的所有输入参数或包含在 [] 中的字符串控制集指定缓冲区大小。

    在字符的情况下,单个字符可以如下读取:

    char c;
    scanf_s("%c", &c, 1);
    

    http://msdn.microsoft.com/en-us/library/w40768et.aspx

    【讨论】:

    • 非常感谢,解决了它。但是,如果我使用 for 循环输入 3 个元素,我应该将缓冲区大小设置为 3 吗? printf_s("Enter number of elements: "); scanf_s("%d", &amp;num); pointer = (char*) malloc(sizeof(char) * num); for (i = 0; i &lt; num; i++, pointer++) scanf_s(" %c", pointer, num);
    • 由于一次转换一个字符,所以缓冲区大小应该指定为1,scanf_s( "%c", pointer, 1 )
    【解决方案3】:

    避免使用malloc(即使 Barak 的回答是正确的)

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    
    int main(void)
    {
        char x;
        scanf_s("%c", &x);
        printf_s("%c", x);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2010-11-10
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2013-05-18
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多