你能改变指针指向的大小吗?



例如,如果指针指向一个字符数组,上面写着"你好,你好吗?而且您只希望指针指向 Hello。 我正在传入一个字符指针,当我引用它时,它会读取整个数组。 我尝试使用 for 循环来减小大小,当它点击" "时会中断。 但我没有运气弄清楚。 有什么想法吗?

const char *infile(char * file )
{
    cout<<file<<endl;  //this prints out the entire array
    int j;
    for(j=0;j<500; j++)
    {
        if(file[j]==' ')
           break;
    }
    strncpy(file, file,  j);
    cout<<file<<endl;  //how to get this to print out only the first word
}

如果源字符串的前 j 个字节中没有 null 终止符,则strncpy()不会追加 null 终止符。而你的案子,没有。

我认为您要做的是手动将第一个空格更改为

for (j = 0; j < 500; j++) {
  if (file[j] == ' ') {
    file[j] = '';
    break;
  }
}

首先,避免strtok(就像它主要是瘟疫一样)。这很不愉快,但有时在 C 中是合理的。不过,我还没有看到我称之为在C++使用它的理由。

其次,处理此问题的最简单方法(假设您使用的是C++)可能是使用字符串流:

void infile(char const *file) 
{
    std::strinstream buffer(file);
    std::string word;
    buffer >> word;
    std::cout << word;
}

另一种可能性是使用标准::string中内置的一些函数:

void infile(char const *file) {
    std::string f(file);
    std::cout << std::string(f, 0, f.find(" "));
}

。现在我想起来,这可能比stringstream版本简单一些。

char*指针实际上只指向单个char对象。 如果该对象恰好是字符串的第一个(或任何)元素,则可以使用指针算法来访问该字符串的其他元素 - 这就是通常访问字符串(C 样式字符串,而不是C++样式std::string对象)的方式。

(C 样式)字符串只是以空字符 (' ") 结尾的字符序列。 (''终止符之后的任何内容都不是字符串的一部分。 因此,字符串"foo bar"由以下字符序列组成:

{ 'f', 'o', 'o', ' ', 'b', 'a', 'r', '' }

如果要将字符串从 "foo bar" 更改为仅 "foo" ,一种方法是简单地将空格字符替换为空字符:

{ 'f', 'o', 'o', '', ... }

...不是语法的一部分;它表示仍然存在的字符('b''a''r'''),但不再是字符串的一部分。

由于您使用的是C++,因此使用std::string可能会更好;它更加强大和灵活,并且使您不必担心终结器,内存分配和其他细节。 (当然,除非本练习的重点是了解 C 样式字符串的工作原理。

请注意,这会修改 file 指向的字符串,并且该更改将对调用方可见。 您可以通过创建字符串的本地副本(这需要为其分配空间,然后释放该空间)来避免这种情况。 同样,std::string使这种事情变得容易得多

最后,这个:

strncpy(file, file,  j);

在几个层面上都很糟糕。 像这样使用重叠的源和目标调用strncpy()具有未定义的行为;从字面上看,任何事情都可能发生。 strncpy()不一定在目标中提供适当的 NUL 终止符。 从某种意义上说,strncpy()并不是一个真正的字符串函数。 你最好假装它不存在。

请参阅我对这个话题的咆哮。

这样做

会容易得多

 if(file[j]==' ') {
   file[j] = 0;
   break;
   ..
  // strncpy(file, file,  j);

使用strtok可能会让你的生活更轻松。
用''作为分隔符拆分字符串,然后打印从strtok获得的第一个元素。

使用"strtok",例如参见 http://www.cplusplus.com/reference/clibrary/cstring/strtok/

如果你问的是"我可以动态调整这个指针指向的内存块的大小吗"那么......不是真的,不是。(您必须创建一个所需大小的新块,然后复制字节,删除第一个块等)

如果您尝试只"打印第一个单词",请将空格位置的字符设置为 0。 然后,当你输出 file* 指针时,你只会得到第一个单词(直到 \0 的所有内容)。 (请阅读以 null 结尾的字符串,了解有关为什么以这种方式工作的更多信息。

但这完全取决于你正在做的事情有多少是展示你试图解决的问题的例子。 如果你真的要"拆分字符串",那么你至少要考虑使用 strtok。

为什么不一次输出每个字符,然后在点击空格后中断。

const char *infile(char * file )
{
  cout<<file<<endl;  //this prints out the entire array
  int j;
  for(j=0;j<500; j++)
  {
    if(file[j]==' ')
       break;
    cout<<file[j];
  }
  cout<<endl;
}

这与指针的大小无关。对于特定类型,指针始终具有相同的大小。

Strtok 可能是最好的解决方案(每次遇到空格、","、点或"-"时,使用 strtok 的代码都会将字符串分成子字符串。

char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string "%s" into tokens:n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%sn",pch);
    pch = strtok (NULL, " ,.-");
  }

资料来源 : CPP STRTOK

std::copy(file, std::find(file, file+500, ' '),
          std::ostream_iterator<char>(std::cout, ""));

如果您使用 malloc 分配了 char * 指向的空间,则可以使用 realloc 更改大小。

char * pzFile = malloc(sizeof("Hello how are you?" + 1));
strcpy(pzFile, "Hello how are you?");
realloc(pzFile, 6);
pzFile[6] = '';

请注意,如果未设置 null 指针,则使用该字符串可能会导致问题。

如果您只是想缩短字符串,您所要做的就是将 null 终止符设置在第 6 位。 分配的空间大于需要的空间,但只要不短就可以了。

我强烈建议您主要要做的是将字符串复制到空格。

char * pzInput = malloc(sizeof("Hello how are you?" + 1));
strcpy(pzInput, "Hello how are you?");
char * pzBuffer = malloc(BUFFER_SIZE);
char * pzSrc = pzInput;
char * pzDst = pzBuffer;
while (*pzSrc && ' ' != *pzSrc)
  *(pzDst++) = *(pzSrc++);
*pzDst = '';

这也最终导致 pzSrc 指向字符串的其余部分以供以后使用!

相关内容

  • 没有找到相关文章

最新更新