繁体   English   中英

字符串操作-奇怪的字符

[英]string operations - weird characters

描述:

我用fgets()读取userinput(例如“ ls -l /”),并调用Parse()并将其分隔开(“ ls”“ -l”“ \\”)供以后使用。

问题是:第一个周期的令牌中有奇怪的字符(如下图所示),但是从那以后输出就很好了。 我试图用零初始化两个缓冲区,而行为没有变化。 请解释我的第一个输出中发生了什么。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>

typedef char* string;
char inputBuffer[512];
string parse[256];
int j,parseCount;
void Parse(void);


void Parse(void)
{
    char buffer[512];
    string token;
    token = " ";
    strcpy(buffer, inputBuffer);
    j=0;
    parse[j] = strtok (buffer, token); 
    while (parse[j] != NULL)
    {
        j++;
        parse[j] = strtok (NULL, token); 
    }
    parseCount =j;  
}

int main (void)
{
    printf(">> ");
    fgets(inputBuffer, 512, stdin);   /* input buffer, max.Input(char), whereFrom?*/
    Parse();
    for (j=0;j<parseCount;j++){
         printf("[%d] %s\n",j, parse[j]);
    }
    return main(); 
}

产量

这条线

parse[j] = strtok (buffer, token); 

将内存地址存储在buffer ,该地址对于Parse()是本地的。 Parse()返回时,表示buffer的内存无效,因此,当试图取消引用以打印其引用的内容时,存储在parse中的地址也不再有效。

要解决这个问题,可以使用调用函数创建一个临时工作缓冲区,并将对它的引用传递给`Parse():

char * parse[256] = 0;
char buffer[512] = "";
size_t parseCount = 0;

void Parse(char * buffer)
{
  const char * token = " ";
  size_t j = 0;
  parse[j] = strtok(buffer, token);
  while (parse[j] != NULL)
  {
    j++;
    parse[j] = strtok(NULL, token);
  }
  parseCount = j;
}

int main(void)
{
  fgets(buffer, 512, stdin);
  {
    char buffer_tmp[512];
    strcpy(buffer_tmp, buffer);
    Parse(buffer_tmp);

    for (size_t j = 0; j < parseCount; j++)
    {
      printf("[%zu] %s\n", j, parse[j]);
    }
  }
  return 0;
}

由于我不喜欢全局变量,因此我希望以下几点:

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

size_t parse(char * buffer, char ** parse)
{
  const char * token = " ";
  size_t j = 0;
  parse[j] = strtok(buffer, token);
  while (parse[j] != NULL)
  {
    j++;
    parse[j] = strtok(NULL, token);
  }
  return j;
}

#define IN_MAX (512 + 1 + 1)

int main(void)
{
  char buffer[IN_MAX] = "";

  if (NULL != fgets(buffer, IN_MAX, stdin))
  {
    char buffer_tmp[IN_MAX];
    strcpy(buffer_tmp, buffer);

    {
      size_t parse_count = 0;
      char * parse[IN_MAX/2 + 1] = 0; 
      size_t parse_count = parse(buffer_tmp, parse);

      for (size_t j = 0; j < parse_count; j++)
      {
        printf("[%zu] %s\n", j, parse[j]);
      }
    }
  }
  else if (ferror())
  {
    fprintf(stderr, "Error reading from inout stream.\n");
  }

  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM