ページ 11

コンマ以前の部分を削除したい

Posted: 2010年7月15日(木) 04:47
by shiro4ao
最初に出てくるコンマより前の部分を消したいです。
「a,b,c,d」が「b,c,d」になって欲しいのです。
以下のようなコードを書きましたがうまくいきませんでした。
=======================ここから==========================
#include <stdio.h>
#include <string.h>

int main(void){
char *p,buf2[/url]="a,b,c,d";
int k;
p = strchr( buf2, ',' );
if ( p != NULL ){
for(k=0;k<(int)p-(int)buf2;k++){
strcpy(buf2+k," ");
}
}

printf("%s",buf2);
return 0;
}
==================ここまで===============================
何がまずかったのでしょうか?

Re:コンマ以前の部分を削除したい

Posted: 2010年7月15日(木) 05:55
by ドラ
>最初に出てくるコンマより前の部分を消したいです。
>「a,b,c,d」が「b,c,d」になって欲しいのです。
コンマより前の部分を消すとはどのような処理を想定されているのでしょうか?
'b'をbuf2[0]にコピー、その次の','をbuf2[1]にコピー・・といった具合に
ずらしていくのかと思いましたが、" b,c,d"のように最初に見つけた','までを
半角スペースで上書きしたいのでしょうか?

>for(k=0;k<(int)p-(int)buf2;k++){
> strcpy(buf2+k," ");
>}
strcpy()ではナル文字まで書き込まれてしまいます。

また同じ配列の要素を指すポインタ同士の減算は合法です。
逆に (int)p-(int)buf2 のようにキャストしてしまうとまずいはずです。

Re:コンマ以前の部分を削除したい

Posted: 2010年7月15日(木) 06:29
by フリオ
 
 こういうことでしょうか。
 
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[/url] = "a,b,c,d", *p;
    
    puts(s);
    if(p = strchr(s, ',')){
        ++ p;
        memmove(s, p, strlen(p) + 1);
    }
    puts(s);
    return 0; 
}
画像

Re:コンマ以前の部分を削除したい

Posted: 2010年7月15日(木) 06:42
by shiro4ao
なるほど!
メモリブロックの移動の関数があるのですね
ありがとうございました。無事解決しました。