• ベストアンサー

文字列

・文字列をキーボードから入力する関数を作成する。 書式:char *StrInp(char *pDefStr, int nLen); 引数:char *pDefStf; 初期文字列 int nLen; 入力可能文字数(1~79) 戻り値:正常ならば、入力した文字列の先頭ポインタ、エラー時はNULL。 処理:pDefStrに与えた文字列を初期値とする文字入力を行う。    nLenで指定した文字数まで入力可能とし、その範囲は1~79    までする。入力時の初期カーソル位置は与えた文字列の最後    になります。初期文字列が必要ない場合はヌル文字を与えます。    初期文字列を与えられた場合は、その文字列も更新可能とする。   ・入力の終了は「リターン」キーとする。   ・「BS」キーを押すと、カーソルの1文字前の文字前の文字を    消去する。 という、問いです。難しくてわかりません。どなたかたすけてください。        

noname#169100
noname#169100

質問者が選んだベストアンサー

  • ベストアンサー
  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

 昔の、DOS のときに、 NEC のコンピュータでやっていたときは、 画面の文字の制御に ESC エスケープシークエンス というのがあって、それを使って案外簡単に やれていました。  いまも、その方法が有効か否かは分かりません。 ウインドウズでこの機能を自分で作るのは面倒です。 参考になるのは、ピッツオルド の プログラミングウインドウズ と言う本です。  そこには、キーボードイベントを処理するプログラムのサンプルがあります。 しかし、漢字を含めてこの機能を作ろうとすると フロントエンドプロセッサ エイトク(一太郎のやつ) で使っている Dll を使ってさらに面倒なことが必要になります。 私は、テキストコントロールを使わないで それと同じものを作ろうとしばらく 頑張っていましたが今は NT のエディットコントロールを 使っています。

noname#169100
質問者

お礼

MS-DOSに準ずる。となっています。

その他の回答 (2)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

>MS-DOSに準ずる。となっています。 そうすると、画面制御に関してはESCシーケンスを使ったカーソル制御となりますね(UNIX等のコンソール画面も同等です)。 printf を使ってエスケープコードを出力することでカーソル位置等を制御します。 具体的にどんな制御コードがあって、どんな書式かはもう忘れてしまいました。インターネット上で検索すれば出てくるかもしれません。 キー入力に関しては、すっかり忘れました。biosをコールするとか、そのためのライブラリが用意されていたような気もします。もしかしたら getchar 等でできるかもしれません。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

課題ですか?難しいですね。 ターゲットとなるプラットホームはなんでしょう? UNIX? DOS? Windows? それとも汎用的なプログラムでしょうか? それぞれでやり方が違ってくると思います。 #カーソルの制御とか、面倒ですね

noname#169100
質問者

お礼

MS-DOSに準ずる。となっています。

関連するQ&A

  • 文字列の受け渡し

    先ほど質問したものですが、お願いします。 関数で戻り値として、文字列を扱う場合、 char* sendstr(void){ char* mychar="HELLO!!\n"; return mychar; } ならうまくいきますが、 char* sendstr(void){ char mychar[]="HELLO!!\n"; return mychar; } だと、うまくいきません。 配列の場合、mycharで、ポインタと なると、思うのですが。 後者の方が、分かりやすそうですが、 だめなのでしょうか。 (char*は文字型のポインタで、文字列 へのポインタになるのでしょうか)。

  • 文字列入力について

    いつも大変お世話になってます。 文字列の扱いがどうも苦手なようなのでまた教えていただきに参りました。 今回は文字列の最大長を指定せずに入力時に幾らでも書けるプログラムを書きたいと思ってます。 int main() { ↓★最大長を指定しない char* buff=""; //初期化 printf("文字列入力\n"); if(gets_s(buff,sizeof(buff)-1) == NULL){ printf("NULL\n"); } ~~~~別処理~~~~ printf("%s\n", buff); return 0; } 文字列を入力したところで別処理に入る前にエラーが出て強制終了します。 aaa.exe の 0x10259554 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00415986 に書き込み中にアクセス違反が発生しました。 こういったエラーはポインタの扱い方に誤りがあるのでしょうか? また、最終的に文字列の最大長を指定せずに宣言し、入力できるように するにはどのようにしたらよろしいのでしょうか?

  • 文字列→数値変換関数

    ・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。 

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }

  • 文字列のある行数を表示する

     お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #include <stdio.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 using namespace std; int main( ) { FILE *fp;//ファイルポインタ char filename[256];//ファイル名 char key[128];//検索文字列 char key2[128];//見つけた文字列の保存 int iCnt[128];//見つけた文字 char c;    int keylen;//検索文字列の長さ int i = 0;//検索文字列の位置 int search = FALSE;//検索中フラグ int count = 0;//検索文字列出現回数 int j = 0; //検索対象ファイル名と検索文字列をコンソール入力 cout << "ファイル名を入力してください⇒  "; cin >> filename ; cout << "検索文字列を入力してください⇒  "; cin >> key; keylen = strlen(key); if((fp = fopen(filename,"r")) == NULL)     { cout << "ファイルオープンエラー\n" ; exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF) { if(search) {//検索中       //検索文字列に一致しない文字が現れた    if(c != key[i]) { search = FALSE; i = 0; } else{  i++; } }   else{ //検索中ではない if(c == key[i]) { search = TRUE; i++; } }     //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; iCnt[i] = 1; search = FALSE; } } fclose(fp); cout << "出現回数は " << count << '\n'; //ファイル(filename)からの読み込み        ifstream ifs(filename); string buf; while(getline(ifs, buf) && ifs ) { // ここで行目数の処理を行っています。 j++; if((count++ && search = FALSE) == TRUE) { cout << j << "行目" << endl; } } return 0; }

  • static変数の配列の初期値を空文字列にする一般的な方法

    いつもお世話になっております。 static変数の配列の初期値を空文字列(各要素が'\0')にしたいです。 static変数なので放って置いても各要素に'\0'が入りますが、 初期値として空文字列にしている事を明記したいです。 そこで以下の様な方法を考えてみました。 (1)初期値に何もせず、コメントを書いておく (2)初回起動フラグを持ち、フラグが立っていれば空文字列にする (3)初期値にnull文字をSTR_LENの数だけ書く (4)初期値の先頭のみnull文字にし、残りは省略する どの様な方法が一般的でしょうか? 上記以外にもあれば、教えていただければ幸いです。 また、以下は私が考えたそれぞれの方法のソースです。 -------------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #define STR_LEN 16 #define FLAG_ON (1) #define FLAG_OFF (0) -------------------------------------------------------------------------------- /* 初期値に何もせず、コメントを書いておく */ -------------------------------------------------------------------------------- void clear_1(void) { static char hoge[STR_LEN]; /* 空文字列 */ } -------------------------------------------------------------------------------- /* 初回起動フラグを持ち、フラグが立っていれば空文字列にする */ -------------------------------------------------------------------------------- void clear_2(void) { static char hoge[STR_LEN]; static int first = FLAG_ON; if(first == FLAG_ON){ strncpy(hoge, "\0", STR_LEN); first = FLAG_OFF; } } -------------------------------------------------------------------------------- /* 初期値にnull文字をSTR_LENの数だけ書く */ -------------------------------------------------------------------------------- void clear_3(void) { static char hoge[] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; } -------------------------------------------------------------------------------- /* 初期値の先頭のみnull文字にし、残りは省略する */ -------------------------------------------------------------------------------- void clear_4(void) { static char str[STR_LEN] = {'\0', }; } --------------------------------------------------------------------------------

  • 文字列

    ・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。 自分自身で、正の整数はできました。見てください。そして、負の整数や、「int *pRetCode」の使い方をおしえてください。 #include <stdio.h> short AtoS(cahr *pStr, int *pRetCode); void main(void) { short val; int code; val = AtoS("1234", & code); printf("%d\n", val); val = AtoS("-789", & code); printf("%d\n", val); } short AtoS("char *pStr, int *pRetCode) { short suu; suu = 0; while("\n" != *pStr) { suu = *pStr - '0' + suu * 10; pStr++;   } return(suu); } までしかできません。どなたか教えてください。  

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • ポインタ

    字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 必ず,具体的な解答を提示して下さい。 char str__com(char *s,char *t,int count) { while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

  • 文字列と整数型について

    はじめまして。 どうしても困っているのでヒントでも良いのでおねがいします。 関数内(func1)で確保した文字列変数のポインタを 別の関数(func2)にポインタ渡しします。 func2内で整数型で計算した結果を引数で示された文字列変数に 代入するというようなことをしたいと思ってます。 ここで、intは4byteとします。 メモリ長だけで見ると、bit[4] = tmp です。 void func1(){ char bit[4]; func2(bit); return; } void func2(char* p){ int tmp = 0x10101100; p = tmp; <---- ??? return; } そこでどのようにすれば、 代入することができるのか分かりません。 以下のような結果になるように代入したいと思っています。 bit[0] = 0x10; bit[1] = 0x10; bit[2] = 0x11; bit[3] = 0x00; 小さな文字列型に整数型をどのように渡せばよいのかが 一番疑問に思っているところです。 整数型に文字列型を代入する場合には 文字列のバイト指定とシフト演算で実現できています。 ヒントでもよいのでお願いします。