如何使用指针打印元素

时间:2011-04-06 14:56:36

标签: c pointers

问候,

我一直在研究C ++。 我现在正在接受指点。 但我正在创建一个C ++程序,它将要求输入一个字符串(“%s”)。 我想在另一条线上显示它的角色。 但是当我运行该程序时,我收到了错误的字母。 这是我的代码;

#include<stdio.h>
#include<stdlib.h>
main() {
char* name;
name = (char *)malloc(sizeof(char));
printf("Enter string: "); scanf("%s", name);
while(*name != '\0') {
printf("%c", name); *name++
}
}

非常感谢您的回复。

4 个答案:

答案 0 :(得分:2)

malloc(sizeof(char))为单个字符分配空间。这可能不是你想要的。正如下面的评论所指出的那样,*name++中的解除引用是毫无意义的。它没有任何伤害,但可能表明你对某些事情的看法不正确。 name++具有相同的效果。

答案 1 :(得分:2)

首先,如果你要学习C ++,你应该学习编写C ++程序,而不是C程序。这是您在惯用语C ++中的程序:

#include <iostream>
#include <string>
int main(int, char **) {
    std::string name;
    std::cout << "Enter string: " << std::flush;
    std::cin >> name;
    std::cout << name << "\n";
}

使用C ++及其标准库而不是C及其标准库的一个优点就是:您几乎不需要使用指针。

但是,将你的计划用于它的价值,有一些问题。首先,在C ++中,如果要访问C头文件,则应将它们包含在C ++名称中:

#include <cstdio>
#include <cstdlib>

接下来,main需要正确的签名:

int main(int, char**) {

最重要的是,您没有为用户名分配足够的空间:

name = (char *)malloc(A_BIG_ENOUGH_NUMBER);

在这里,您必须分配足够的空间scanf()不会在缓冲区末尾写入。但是,在scanf运行之前,你不可能知道它有多大。这个catch-22是“缓冲区溢出”错误的来源。对于您的测试程序,由于您控制输入,因此可以选择一个比您输入的任何名称都大的数字。在生产代码中,您永远不能以这种方式使用scanf

name = (char *)mallocc(40);

顺便说一句,如果您将其编译为C代码,则不应该从malloc转换回报。如果要将其编译为C ++代码,则必须始终从malloc转换返回值。

printf("%c", *name); name++

此行缺少分号。你编译这个程序了吗?将来,请只发布您编译的代码。请使用计算机的剪切和粘贴功能发布代码,不要手动重新键入代码。

这一行有另外两个问题。首先,您必须拒绝name指针以访问它指向的数据。 (所以,*name而不是name。)其次,您不需要在此行的第二个语句中取消引用名称,因为您不会对生成的指向数据执行任何操作。 (所以,name++代替*name++。)

最后,最重要的是,从good book购买,阅读和学习。

答案 2 :(得分:0)

那不是C ++,而是C。

malloc(sizeof(char))会分配一个char的存储空间,我希望你能想要更多。

此外,无需动态分配。尝试:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char name[256];
    char *p = name;

    printf("Enter string: ");
    scanf("%s", name);

    while (*p != '\0') {
        printf("%c", *p);
        p++;
    }

    return 0;
}

答案 3 :(得分:0)

您的程序可能打印垃圾,因为您只为字符串缓冲区分配一个字节。当用户输入字符串时,您将具有未定义的行为,因为scanf将写入name的末尾。

您需要像这样分配name

char *name = (char *)malloc(MAX_STRING_SIZE, sizeof(char));

使用calloc代替malloc更好。无论如何,定义MAX_STRING_SIZE。合理的尺寸取决于应用。在您的情况下,如果用户将输入短字符串,那么合理的缓冲区大小可能是64字节,或者可能是80或100。

此外,在while循环中,您可以在一个步骤中递增和取消引用指针,如下所示:

printf("%c", *name++);

如果你不喜欢那种简洁,那么你可以将它们分开,但你不需要取消引用指针来增加它。

printf("%c", *name); name++;
相关问题