我需要有关c-strings和函数的分配方面的帮助。
#include <iostream>
using namespace std;
//other functions
char display_last_nchar(char sent[], int n); // function i'm having trouble with
void main()
{
char sentence[31];
int selection, n;
do {
cout << "Please enter a string: " << endl;
cin.getline(sentence, 31, '\n'); //also, for me here i have to hit enter twice. How can I fix that?
cin.ignore();
cout << "Please make a selection: " << endl;
//other options
cout << "4. Display the last n character of the string " << endl;
cout << "7. Exit" << endl;
cin >> selection;
cin.ignore();
switch (selection)
{
case 4:
cout << "How many characters from the end of the string "
<< "do you want to display? : " << endl;
cin >> n;
cin.ignore();
if (n >= 30)
{
cout << "Error: too many characters" << endl;
break;
}
else
display_last(sentence, n);
cout << sentence << endl;
break;
case 7:
break;
}
}
while (choice != 7);
//other functions
char display_last_nchar(char sent[], int n)
{
for (int i = n; n > 30; i++)
{
sent[i]; //I know this is wrong but this is a guess that i took
}
return sent[n];
}
我知道如何显示字符串的前n个字符。对于该功能,如果用户输入了一个名为“我的仓鼠有一个新玩具”的字符串并且他们想要显示前8个字符,它会将第8个字符后的任何字符设置为空,因此只显示“我的火腿”。
我尝试做的事情,因为设置了display_last_nchar,用户输入数字前的每个字符都为0,但所有这一切都是整个字符串为空。
有人可以向我解释一下,为了创建一个显示字符串最后n个字符的函数,我需要采取的步骤。我试过在网上和我的书中试过,但它并没有真正帮助我。
答案 0 :(得分:1)
指向char
的指针通常被认为是C字符串。例如,格式化输出的运算符(operator<<()
这样做)。 C字符串遵循特定约定:它们由遇到的第一个空字符终止。当在期望指向对象的指针的上下文中使用数组时,它们会“衰减”到相应的对象中。
要打印n
数组char
的第一个sentence
个字符,您只需将sentence[n]
设置为null,然后再将其与输出运算符一起使用。您可以使用std::ostream
的无格式输出函数write()
来避免修改字符串(例如,不能修改字符串文字):
std::cout.write(sentence, n);
打印对象通常被认为是非修改操作,即我使用未格式化的输出来打印第一个n
字符或者写出单个字符的内容,如使用
std::copy(sentence, sentence + n, std::ostreambuf_iterator<char>(std::cout));
要打印最后一个n
字符,您需要找到字符串s
的长度,确定s
是否大于n
,如果是,则只需在sentence + (n - s)
开始打印。您可以使用格式化或未格式化的方法来编写最后n
个字符。对于对称性,我使用相同的方法编写第一个n
字符,但从其他地方开始。
if (std::cin >> n) {
// use n
}
else {
// report a read failure and potentially try to recover
}
答案 1 :(得分:1)
使用C ++字符串STL。 substr
方法在这里很有用。例如,输出字符串的最后n
个字符
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
int n;
getline(cin, s);
cin >> n;
if (n < s.length())
cout << s.substr(s.length() - n) << endl;
else
cout << "Not enough characters\n";
return 0;
}
<强>输入强>
My hamster has a new toy
5
<强>输出强>
w toy
答案 2 :(得分:0)
这是一个非常直截了当的问题。你有一个起点,你需要显示它直到字符串的结尾。
您可以遍历从位置n开始的字符串字符,直到您读取空值(用于指示字符串的终止)。
char *display_last_nchar(char sent[], int n)
{
char buff[100];
int i = strlen(sent) - n; char ch;
while((ch = sent[i])!='\0')
{
strcat(buff, ch);
}
strcat(buff, '\0');
return buff;
}
字符数组(或任何类型的数组)作为指针传递,因此您使用的返回类型是char指针而不仅仅是char。
此函数将返回指向存储最后n个字符的缓冲区的指针。请记住,strlen和strcat是string.h库中的函数。