0

私はCが初めてで、文字配列を分割しようとしています(これはArduioのシリアルポートから受け取ります)。いくつかのチュートリアルを調べて、これを思いつきました。デバッグを手伝ってください。

char action[10];
unsigned long duration;

void split(char input[20])
{
 char *param, *ptr;

 param = strtok_r(input, "#", &ptr);
 action = *param;                      // Need help with this line

 param = strtok_r(NULL, "!", &ptr);
 duration = (unsigned long) *param;    // Need help with this line
}

私が理解していることから、strtok_r は区切り文字 (#) の直後の文字へのポインターを返します。では、action[] を区切り文字までの input[] のサブセット文字配列にしたい場合、どうすればよいでしょうか?

編集: 入力は次のようなものです: "left#1000!"

4

4 に答える 4

1

最初のトークンは文字列で、2番目のトークンは長いようです。strncpyにコピーparamしてactionから、strtoulに解析するunsigned longために使用できますduration

param = strtok_r(input, "#!", &ptr);
strncpy(action, param, sizeof(action));
// Force zero termination
action[sizeof(action)-1] = '\0';

param = strtok_r(NULL, "#!", ptr);
duration = strtoul(param, &param, 10);
于 2012-07-16T13:21:56.133 に答える
1

このスニペットはプレーン C で動作するはずです (コメントを追加)。Cstructを使用して値を収集できます。Structs は、単純なデータ型のような関数から返される場合があります (示されているように)。これを独自のプログラムの開始点として使用できます。

編集:そのようなプログラムは関数を必要としません(受信データにバイトstrXYZ(..)がある場合に役立ちます)。'\0'

...

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

 typedef struct {
    char action[10];  unsigned long duration;
 } Result;


 Result split(char *input, char delim)
{
 Result result = {'\0', 0};                   // initialize result by zeros
 char *p = (char*)memchr(input, delim, sizeof(result.action)-1); 
 if(p != NULL) {                              // if delimiter found in input 
    memcpy(result.action, input, p-input);    // copy text till delimiter
    result.duration = strtoul(p+1, NULL, 10); // convert number after delimiter
 }
 return result;                               // return values
}

 int main(char argc, const char*argv[])
{
 char input[20] = "left#1000!";

 Result result = split(input, '#');
 printf("action: %s, duration %u\n", result.action, result.duration);

 return 0;
}

...

よろしく

rbo

于 2012-07-16T13:53:23.040 に答える
1

を初期化できませんaction = *param

使用する必要があります

memcpy(action, param, strlen(param))

duration = (unsigned long) atoi(param)
于 2012-07-16T13:25:14.273 に答える
1

C で文字列 (または char 配列) を割り当てるには、strcpy() と必要なキャストを使用する必要があります。

http://en.cppreference.com/w/c/string/byte/strcpy にアクセスしてください

この関数は、文字列間のメンバーバイスの割り当てを処理します。手動で行うには、ループを使用して各配列メンバーを個別に割り当てる必要があります。

于 2012-07-16T13:28:38.800 に答える