2016-09-26 8 views
0

C文字列と関数に関する割り当てが必要です。文字列の最後のn文字を表示する

#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文字を表示する方法を知っています。この機能では、「My hamster has new toy」という文字列を入力して最初の8文字を表示したい場合は、8文字目以降の文字をnullに設定し、「My hams」と表示します。

display_last_ncharが設定されているため、ユーザが入力する数字の前のすべての文字が0になりましたが、そのすべてがnullでした。

文字列の最後のn文字を表示する関数を作成するために必要な手順を教えてください。私はオンラインで見てみましたが、私の本では見たことがありません。

+0

は、あなただけの表示や表示にしたいとオリジナルを変更しますか? – Zeokav

+0

私はユーザーが入力した番号の後に文字を表示したいだけです。したがって、文字列が "こんにちは"で、ユーザーが文字列の最後の3文字を表示したい場合は、 "ere"だけがmainに表示されます。 –

答えて

1

charへのポインタは、しばしばC文字列とみなされます。たとえば、書式設定された出力のオペレータ(operator<<()はそうです)。 C文字列は、特定の規則に従います。それらは、最初に検出されたヌル文字によって終了します。オブジェクトへのポインタが予想されるコンテキストで配列が使用されるとき、配列は対応するオブジェクトに「崩壊する」。あなただけの出力演算子とそれを使用する前に、nullにsentence[n]を設定する必要がsentence

char配列の最初 n文字を印刷します。あなたは std::ostreamの未フォーマット出力機能 write()、代わりに、文字列を変更することを避けるために(例えばは、文字列リテラルを変更することはできません)を使用することができます:オブジェクトを印刷

std::cout.write(sentence, n); 

は、通常、非変更操​​作とみなされ、すなわち、I 「あなたは、文字列sの長さを見つける必要があり、最後のnの文字を印刷するには

std::copy(sentence, sentence + n, std::ostreambuf_iterator<char>(std::cout)); 

を使用してのような個々の文字を書き込み最初n文字か何かを印刷するようにフォーマットされていない出力を使用D、かどうかを判断snより大きい場合は、単にsentence + (n - s)で印刷を開始してください。最後のn文字を書式設定または非書式のどちらの方法でも使用できます。対称性のために、私は最初のn文字を書くのに同じアプローチを使用したいが、他の場所から始める。

ところで、あなたは常にあなたの入力は例えば、読んだ後に成功したかどうかを判断すべきである:

if (std::cin >> n) { 
    // use n 
} 
else { 
    // report a read failure and potentially try to recover 
} 
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型のポインタだけ文字ではありません。

この関数は、最後のn文字を格納するバッファへのポインタを返します。 strlenとstrcatはstring.hライブラリの関数であることを覚えておいてください。

0

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 
関連する問題