我需要制作一个程序,以1个字符串的形式询问用户的姓名和id,然后提供一个单独的姓名和id。例如:
输入学生信息:Kobe Bean Bryant 51012345。
学生姓名:Kobe Bean Bryant
学号:51012345
我自己尝试了一下,得到了不同的输出,比如:
学生姓名:Kobe Bean Bryant
学号为:&@
这是我的代码:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int getNameAndID(char nameid[]) {
char name[50];
char id[50];
bool notnumber=true;
int i=0;
for (i; nameid[i]!=' '; i++) {
if (nameid[i] >= '0' && nameid[i] <= '9') {
notnumber = false;
}
if (notnumber) {
name[i] = nameid[i];
}
else if (!notnumber) {
id[i] = nameid[i];
}
}
cout << "Student name is: " << name;
cout << "nStudent ID is: " << id;
}
int main() {
cout << "Enter the student information: ";
char a[50];
cin.getline(a, 50);
getNameAndID(a);
}
ID仍然有一些问题。无法理解出了什么问题,请帮帮我:(
(通过将bool和int分别设置为true和0进行编辑)
我在您的代码中发现了一些东西:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int getNameAndID(char nameid[]) {
char name[50];
char id[50];
bool notnumber;
int i;
for (i; nameid[i]!=' '; i++) { // <---- (1)
if (nameid[i] >= 48 && nameid[i] <= 57) {
notnumber = false;
}
if (notnumber) { // <---- (2)
name[i] = nameid[i];
}
else if (!notnumber) {
id[i] = nameid[i];
}
}
cout << "Student name is: " << name;
cout << "nStudent ID is: " << id;
// <---- (3)
}
int main() {
cout << "Enter the student information: ";
char a[50];
cin.getline(a, 50);
getNameAndID(a);
}
(1)i
从不初始化,它通过访问nameid[i]
来调用未定义的行为。
(2)name[i] = nameid[i];
这不会在name[i]
上附加nameid[i]
(同样适用于id[i] = nameid[i];
)。考虑以下内容:
index: 0 1 2 3 4 5 6 7 8 9
nameid: hello world 1 2 3 4
id: ? ? ? ? ? ? 1 2 3 4
在id
的开头会有一部分未初始化的值。为id
保留一个单独的索引以供分配应该可以满足您的需要。
(3)int getNameAndID()
中不返回任何值,这也会调用未定义的行为。
既然你使用的是C++而不是C,那么使用std::string
会让你的生活变得更轻松,你可能想做一些类似的事情:
void getNameAndID(string info) {
string name, id;
bool noDigit = true;
for (auto c : info) {
noDigit &= !isdigit(c);
if (noDigit)
name += c;
else id += c;
}
cout << "Student name is: " << name << 'n';
cout << "Student ID is: " << id;
}
int main() {
cout << "Enter the student information: ";
string info;
getline(cin, info);
getNameAndID(info);
return 0;
}
除了用于遍历输入数组nameid
的索引外,还需要为name
和id
保留不同的索引。在插入字符后增加每个char数组的索引,并在末尾记住添加null终止符。
CCD_ 14需要初始化为零。