0

このコードでセグメンテーション違反が発生する理由を教えてください。
コマンドをトークンに分割したいのですが、なぜセグメンテーション違反が発生するのかわかりません!!

char command[500]="asdadas asdasdas asdadas";   
int i,j,k;
char tokens[4][200];

for(i=0,j=0,k=0;  i<strlen(command);  i++)
{
    if(command[i]==' ') 
    {
        tokens[j][k]='\0';
        k=0;
        j++;
        continue;
    }

    tokens[j][k]=command[i];
    k++;
}
tokens[j][k]='\0';
4

3 に答える 3

2

command初期化されていません。これは、strlen(command)呼び出しが 500 バイトを超えて実行され、セグメンテーション違反が発生する可能性があることを意味します。

commandアレイを使用する前に初期化してください。たとえば、memset.

それ以外には、境界チェックはまったくなく、いくつかの任意の配列の長さがあります。これは必ず失敗します。

于 2012-10-17T07:16:31.903 に答える
1

に問題がありtokensます。インクリメントjしておりk、各反復でチェックなしです。

とにかく、あなたがやりたいことをする関数がすでに存在することを知っていますか?

于 2012-10-17T07:22:21.133 に答える
0

他の人々の答えにMoreを追加するには、strsepを使用できます。次のサンプルコードを見てください。

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


int main ()
{
char * command=NULL, *tok=NULL;

command =strdup("asdadas asdasdas asdadas");
while ((tok = strsep(&command, " ")) != NULL )
{
  printf ("..%s..\n", tok);
}

それが役に立てば幸い。;)

于 2012-10-17T08:01:39.170 に答える