C言語関係掲示板

過去ログ

No.433.文字列の最後の文字で処理を切り分けし、編集したい。

[戻る] [ホームページ]
No.3070

文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ヒナコ(2002/10/23 15:18:19)


こんにちは。
またまた、ハマってしまっています。

数値項目格納用の文字列(str1)があります。
その文字列中には、符号が入ってくる場合もあります。

やりたい事は、str1の一番最後1桁が、
"+"(プラス)でもなくて、
" "(空白)でもなくて、
数値でもない時のみ、
str1を前にマイナスを付けて編集したいのです。

例)
str1には以下のような値が入ってきます。
"12345-"
"12345+"
"12345 "
"123456"
  |
 (処理)
  |
  ↓
str1に入っていた値は以下の様に編集される。
"-12345"
"12345"
"12345"
"123456"

このような事がやりたいのです!
どなたかご教授して頂けないでしょうか?
よろしくお願い致します。

No.3073

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---TDa(2002/10/23 16:32:28)


こんにちは。

strtolを使ってみてはどうでしょう。
以下のように使います。

#include <stdio.h>
#include <stdlib.h>

char str[][50] = {
    "12345-",
    "12345+",
    "12345 ",
    "123456"
};

int main(void)
{
    char *tail;
    int i;
    long tmp;
    
    for (i = 0; i < 4; i++) {
        tmp = strtol(str[i], &tail, 10);
        printf("%ld, しっぽ[%s]\n", tmp, tail);
    }
    
    return 0;
}


No.3083

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ヒナコ(2002/10/23 20:47:02)


こんばんわ。
返信ありがとうございます。
さっそく、プログラムに取込んでみました。
うまく処理が行えたのですが、質問があります。

>tmp&nbsp;=&nbsp;strtol(str[i],&nbsp;&tail,&nbsp;10);
strtolの第三引数で10を渡していますが、この意味は何ですか?
調べたところ、「変換する際の数の基数」とありましたが、
意味がつかめません。

また、tmpには、long値に変換できた値が戻ってくるという認識で
よろしいのでしょうか?

No.3077

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ともじ(2002/10/23 17:38:52)


>こんにちは。

>やりたい事は、str1の一番最後1桁が、
>"+"(プラス)でもなくて、
>" "(空白)でもなくて、
>数値でもない時のみ、
>str1を前にマイナスを付けて編集したいのです。

strtokを使ってみました。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
	char str[][50] = {
    		"12345-", "12345+", "12345 ", "123456", "12345?"
	};
	char *p;
	int i, j, len;
	
	for (i = 0; i < 5; i++) {
		/* 最後の+とスペースを削除 */
    		p = strtok(str[i], "+ ");
		len = strlen(p);
		/* 最後の文字が数字ではなかったら */
		if (isdigit( *(p+len-1) ) == 0) {
			for (j = len-1; j > 0; j--)
				*(p+j) = *(p+j-1);
			*p = '-';
		}
		puts(p);
	}
    
	return 0;
}

	


No.3085

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ヒナコ(2002/10/23 21:12:44)


こんばんわ。
返信ありがとうございました。

>strtokを使ってみました。
なるほどと言う感じです。
参考にさせて頂き、処理を上手く行う事ができました。
また、何かありましたら、よろしくお願い致します。


No.3086

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---kamadoma(2002/10/23 21:42:40)



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define IN_FILE "c:\\test.txt"

FILE *fileOpen(char *p_filename,char *p_mode);

int main(void)
{
	FILE *in_fp;
	char line[256];
	char lastMoji;
	char temp[256];

	/*ファイルオープン処理*/
	in_fp = fopen(IN_FILE,"r");

	/*ファイル読み込み処理*/
	while(fgets(line,256,in_fp) != NULL){
		/*最後の文字を取得する*/
		lastMoji = line[strlen(line) - 2];

		switch(lastMoji)
		{
			case '-':
				line[strlen(line) -2] = '\0';
				sprintf(temp,"-%s",line);
				printf(temp);
				printf("\n");
				break;
			case '+':	
			case ' ':
				line[strlen(line) -2] = '\0';
				printf(line);
				printf("\n");
				break;
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				line[strlen(line) -1] = '\0';
				printf(line);
				printf("\n");
				break;
		}

	}

	return 0;
}

FILE *fileOpen(char *p_filename,char *p_mode)
{
	FILE *fp;

	fp = fopen(p_filename,p_mode);
	if(fp == NULL){
		fprintf(stderr,"ファイル[%s]を開けません。\n",p_filename);
		exit(1);
	}

	return fp;
}
// さんぷるソース

#include <stdio.h>

int main( void )
{
	int i; // コメント
	int *p_i = &i; /* ポインタ */
	
	for ( i = 0; i < 128 ; i++ ) {
		printf( "%d", p_i[i] );
	}
	
	retern 0;
}



No.3102

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ヒナコ(2002/10/24 10:34:17)


こんにちわ。返信有難うございます。
私も最後の文字を取得したかったのですが、
その方法が分かりませんでした。
こうやればいいのか〜と分かって嬉しいです。

ところで、質問があるのですが。。。
お答え願えますでしょうか?

>char lastMoji;
と宣言していますが、文字型なのに領域を確保していませんが、
これは、どうしてなのですか?


No.3103

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---ヒナコ(2002/10/24 10:43:19)


こんにちわ。返信有難うございます。
私も最後の文字を取得したかったのですが、
その方法が分かりませんでした。
こうやればいいのか〜と分かって嬉しいです。

ところで、質問があるのですが。。。
お答え願えますでしょうか?

>char lastMoji;
と宣言していますが、文字型なのに領域を確保していませんが、
1文字しか扱わない場合は、領域は用意しなくていいのですか?

また、lastMojiを初期化しようと思って、
memset(lastMoji, '\0', sizeof(lastMoji));
と記述しましたが、コンパイルエラーになってしまいました。
初期化はどうやってすればいいのですか?

No.3105

Re:文字列の最後の文字で処理を切り分けし、編集したい。
投稿者---TDa(2002/10/24 11:21:59)



>>char lastMoji;
>と宣言していますが、文字型なのに領域を確保していませんが、
>1文字しか扱わない場合は、領域は用意しなくていいのですか?
自動変数は宣言が即定義です。この表現は初学者にはかえってわからないですよ
ね。誰か簡潔な表現に置き換えられる方おねがいします。
とにかく
int i;
でiの領域の心配をしなくていいのと同じです。

char lastMojiを初期化しようとすれば単に代入でokです。
lastMoji = '\0';

文字と文字列の区別がついていないようですので参考書などを読み返してみて
下さい。