C++ 如何在char[]数组中手动输入字符?

C++ 如何在char[]数组中手动输入字符?,c++,C++,假设我声明一个数组 字符名[20] 我必须手动在变量中输入名称“Andrew”(少于20个字符),这怎么可能呢 **编辑:我尝试了这个代码,它给了我这个错误 错误:常量字符[10]到字符[30]的赋值中存在不兼容的类型 #包括 #包括 结构学生 { int-id; 字符名[30]; 浮动百分比; }; int main() { int i; 学生记录1; 学生成绩2; 记录1.id=1; record1.name=“西蒙爵士”; 记录2.id=2; record2.name=“de Canter

假设我声明一个数组

字符名[20]

我必须手动在变量中输入名称“Andrew”(少于20个字符),这怎么可能呢

**编辑:我尝试了这个代码,它给了我这个错误

错误:常量字符[10]到字符[30]的赋值中存在不兼容的类型

#包括
#包括
结构学生
{
int-id;
字符名[30];
浮动百分比;
};
int main()
{
int i;
学生记录1;
学生成绩2;
记录1.id=1;
record1.name=“西蒙爵士”;
记录2.id=2;
record2.name=“de Canterville”;
puts(记录1.名称);
puts(记录2.名称);
}

<代码> > p>您指定了C++语言和char数组,并要求手动输入值。答案是:

char name[20] = "Andrew";
如果要从控制台读取值,请使用以下命令:

cin.get(name, 20);
<>但最好使用C++库:

#include <string>
#include <iostream>

std::string name;
std::cin >> name;
#包括
#包括
std::字符串名;
std::cin>>名称;
您也可以使用
strcpy(name,“Some name”)
以下任一方式:

char name[20] = "Andrew";
或者,如果没有语法糖:

char name[20] = {'A','n','d','r','e','w','\0'};

在第一个答案上展开,尝试下面的代码,它将显示此赋值如何在数组上工作

#include <iostream>
using namespace std;

int main() {
    char name[20] = "Andrew";
    for(int i = 0; i < 20; i++)
    {
        cout << i << ": " << name[i] << endl;
    }

    return 0;
}
#包括
使用名称空间std;
int main(){
字符名称[20]=“Andrew”;
对于(int i=0;i<20;i++)
{

cout执行此操作的方法有多种,因为对于数组,您可以通过
[x]
访问单个数组元素(其中
x
是您希望访问的元素)

在这些示例中,我假设“Andrew”是一个C字符串(即,它以空字符结尾)

第一种方法(最繁琐的方法)是分别设置每个数组元素:

name[0] = 'A';
name[1] = 'n';
name[2] = 'd';
name[3] = 'r';
name[4] = 'e';
name[5] = 'w';
name[6] = 0; /* If this is not a C string, and you literally want the characters "Andrew" (and only these characters), you can skip this line) */
但是,这显然有点难键入。谢天谢地,C有一个简洁的特性,您可以在一行中初始化数组,而无需为每个元素使用单独的语句:

char name[20] = {'A', 'n', 'd', 'r', 'e', 'w', 0};
但是还有一种更简单的方法!如果你使用双引号(
“…”
),它基本上等同于上面的代码(用花哨的
{…}
符号):

但是,我介绍的最后两个方法(虽然不是第一个,第一个可以在任何时候运行)只能在变量初始化期间运行,以后不能运行。换句话说,您不能这样做:

char name[20];
name = "Andrew";
在这种情况下,我们可以使用第一种方法(非常乏味!!),也可以使用
中包含的整洁函数,称为
strcpy

strcpy(name, "Andrew");
strcpy
的工作原理是将源(
“Andrew”
)复制到目标(
name
),直到它遇到空字符(并且也将复制空字符)。当您没有常量值时,此函数也很有用。例如,您可以执行以下操作:

char* my_home[20];
char* home_directory = getenv("HOME"); /* an example of a non-constant value */
strcpy(my_home, home_directory);
但是,如果要复制的字符串长度大于目标数组的大小,则这可能会非常不安全。为此,请使用
strncpy
,它将一直复制到达到空字符或复制了指定的最大字符数:

strncpy(name, "Andrew", 20);
请注意,如果源(
“Andrew”
)的长度超过20,则不会添加空字符。因此,如果要将其保留为C字符串,请尝试以下操作:

strncpy(name, "Andrew", 19);
name[19] = 0;

编辑:至于为什么不可能做到
char name[20];name=“Andrew”
,我不知道有什么技术原因使它不可能做到这一点。我猜这只是C语法中的一个限制

我决定看看汇编中会发生什么,因此,从以下源代码:

#include <stdio.h>

int main(int argc, char** argv)
{
    char text[] = "Hello World!";

    puts(text);

    return 0;
}
理论上,这可以在任何时间点完成,而不仅仅是在初始化时。因此,至于为什么C不允许这样做,我不知道。现在,您只需要满足于使用strcpy,或者,如果您希望遵循程序集的功能:

*((uint64_t*)text)       = 8022916924116329800;
*(((uint32_t*)text) + 2) = 560229490;
text[12]                 = 0;

除非你真的想惹恼你的同事,否则不要这样做:p我很确定大多数现代编译器都应该优化掉
strcpy
函数,如果它是常数(即
“Andrew”
,而不是变量或函数,比如
getenv(“HOME”)
).

您可以将字符逐个分配给用户输入的数组的连续元素,也可以仅使用代码存储?名称[0]=“A”;名称[1]=“n”;…@ItayB由用户输入记住C字符串以空字符结尾:)@MiJyn在这种情况下,名称[6]是空字符?不,空字符是
0
(或
'\0'
如果您希望使用引号)。这是为了让函数知道字符串何时结束(这是C中的标准约定):(我指的是他们给出的第二个示例,第一个示例很好)@user3500780更新了我的答案!尝试将
record1.name=“Sir Simon”
替换为
strcpy(record1.name,“Sir Simon”)
(要做到这一点,你必须
包括
是的,它现在确实起作用了:)你知道为什么这是在结构中而不仅仅是等值的唯一方法吗?恐怕我只能告诉你“因为它是这样的”:(我检查了程序集输出,理论上,完全可以做到这一点(它将文本复制到堆栈中,可以在任何时间点完成),因此我猜这只是C语法中的一个限制?很抱歉,我无能为力,我希望我自己知道真正的答案!这已经包含在已接受的答案中,并有适当的解释。但我不知道有多少人会给出答案在我回答之后。对不起,我不知道时间安排。无论如何:在给出答案时,请确保包含解释,而不仅仅是代码片段。谢谢你的建议。我尝试按照你的建议进行操作。:)
#include <stdio.h>

int main(int argc, char** argv)
{
    char text[] = "Hello World!";

    puts(text);

    return 0;
}
...
movabsq $8022916924116329800, %rax  ; Sets %rax to "Hello Wo"
movq    %rax,             -16(%rbp) ; Moves %rax to text[0-7]
movl    $560229490,        -8(%rbp) ; Sets text[8-11] to "rld!"
movb    $0,                -4(%rbp) ; text[12] = 0;
...
*((uint64_t*)text)       = 8022916924116329800;
*(((uint32_t*)text) + 2) = 560229490;
text[12]                 = 0;