1

入力-Hello World

出力-HelloWorld

これは私がcで書いたプログラムです。

しかし、セグメンテーション違反が発生します。

私が使用したロジックは、スペースが見つかったら、それを次の文字と最後まで交換し、「\ 0」文字を挿入することです

#include <stdio.h>

int main()    
{    
        char s[12]="Hello World";    
        char *t;    
        t=s;    
        while(*t)    
        {    
                char *p;    
                p=t;    
                if(*p==' ')    
                {    
                        while(*p !='\0')    
                        {    
                                char x;    
                                x=*p;   
                                *p=*(p+1);    
                                *(p+1)=x;   
                                p++;    
                        }    
                        *(p-1)='\0';    
                }    
                t++;   
        }
        printf("%s\n",s);   
}
4

4 に答える 4

3

K&R スタイルのコピー:

#include <stdio.h>

int main()
{
        char s[12]="Hello World";
        char *src, *dst;
        for(src=dst=s; *dst = *src; src++) {
                if( *dst == ' ') continue;
                dst++;
                }
        printf("%s\n",s);
        return 0;
}
于 2013-08-29T20:40:14.673 に答える
1

この関数の呼び出しで厄介なネストされた while ループを交換します。

void siftLeftAtCurrentPos(char* cstr)
{
   while(*cstr)
   {
     *cstr = *(cstr + 1);
      cstr++;
   }
}

tそれからまで増加しないでください*p != ' '

于 2013-08-29T20:27:51.040 に答える
0

取り出すだけ:    

char x;    
x=*p;   
*(p+1)=x;

これが問題です。

于 2013-08-29T20:39:56.503 に答える
0

内側の while ループは無限ループです。スペースを交換すると、次の文字もスペースになるように作成されます。

ジョナサンの回答で述べたように、値を交換するのではなく、左にシフトするだけでこれを修正できます。とはいえ、ネストされたループを使用せずに、1 回のパスでスペースを削除するさらに効率的なアルゴリズムを作成できます。スペースでいっぱいの文字列がある場合、現在のアルゴリズムは 2 次時間がかかります...

char* in = s; //next character to read;
char* out = s; //where to write the next non-space character;
//copy all the non spaces
while(*in){
   if(*in != ' '){
     *out = *in;
     out++;
   }
   in++;
}
//now fill the rest of the strings with null values:
while(out != in){
   *out = '\0';
   out++;
}
于 2013-08-29T20:44:34.363 に答える