将char数组划分为struct中的不同值

时间:2018-02-20 19:13:48

标签: c

通过tcp套接字,我得到一个这样的字符串:" SmallTitle fromhost 9595"。

收到它后,我想把它分成一个结构,以便更容易使用。

这就是我想出的。但是有问题。 1这是令人讨厌的。 2在最后打印结构时,我会在字符串后面收到垃圾输出。请参见底部的输出示例。不应该打印到' \ 0'?然后它可能会失踪。

struct recieved {
    char what[50];
    char from[50];
    int value;
};


int main(int argc, char const *argv[]) {
    struct recieved leaderRec;

    char *word;
    char buf[] = "leadervalue host 9569"; //Example recieved input from socket.

    word = (char *) malloc(sizeof(char) * 50);
    int i = 0;
    int count = 1;

    do{
        if((buf[i] == ' ') || (buf[i+1] == '\0')){
            //End of word
            //word[strlend(word)+1] = '\0';
            //printf("%s\n", word);
            if(count == 3){
                //The value is here
                //get the last number
                strncat(word,&buf[i], 1);
                leaderRec.value = atoi(word);
                //printf("%d\n", value);
            }

            if(count == 1)
                strncpy(leaderRec.what, word, strlen(word));
            else if(count == 2)
                strncpy(leaderRec.from, word, strlen(word));
            free(word);
            word = (char *) malloc(sizeof(char) * 50);
            count++;
        }
        else {
            //printf("%d\n",i );
            //printf("%s\n", &buf[i]);
            strncat(word,&buf[i], 1);
        }
        //printf("%s", &buf[i]);
        //printf("%d -", i);
        i++;
    } while(buf[i] != '\0');

    printf("%s\n", leaderRec.what);
    printf("%s\n", leaderRec.from);
    printf("%d\n", leaderRec.value);
    return 0;
}

输出:

leadervalue
host__vdso_get
9569

有更好的方法吗? 如何避免示例输出中第二次打印时的垃圾输出?

1 个答案:

答案 0 :(得分:2)

  

但是有问题。 1这是令人讨厌的。 2打印结构时   最后我收到字符串后的垃圾输出。

"垃圾"如评论中所述,打印是因为您没有正确地终止字符串。例如,在调用word之前,您没有将strncat初始化为空字符串(单个空字符)。

  

有更好的方法吗?

当然。我建议使用strtok

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

struct received {
    char what[50];
    char from[50];
    int value;
};

int main(void)
{
  char buf[] = "leadervalue host 9569";
  struct received leaderRec; 
  /* Initialize leaderRec here */      
  memset(&leaderRec, 0, sizeof(leaderRec));

  char *s = strdup(buf);
  char *p = strtok(s, " ");
  if (p != NULL) {
     strncpy(leaderRec.what, p, sizeof(leaderRec.what));
     p = strtok(NULL, " ");
  }
  if (p != NULL) {
     strncpy(leaderRec.from, p, sizeof(leaderRec.from));
     p = strtok(NULL, " ");
  }
  if (p != NULL) {
     leaderRec.value = atoi(p);
  }
  free(s);

  printf("%s %s %d\n", leaderRec.what, leaderRec.from, leaderRec.value);
  return 0;
}