问候,
我一直在研究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++
}
}
非常感谢您的回复。
答案 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++;