Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 你能改变指针指向的对象的大小吗_C++_Pointers_Strncpy - Fatal编程技术网

C++ 你能改变指针指向的对象的大小吗

C++ 你能改变指针指向的对象的大小吗,c++,pointers,strncpy,C++,Pointers,Strncpy,例如,如果一个指针指向一个字符数组,读作“你好吗?”并且您只希望该指针指向“你好”。我传入一个char指针,当我找到它时,它读取整个数组。我尝试使用一个for循环来减少大小,该循环在遇到“”时中断。但我没有运气弄明白。有什么想法吗 const char *infile(char * file ) { cout<<file<<endl; //this prints out the entire array int j; for(j=0;j<5

例如,如果一个指针指向一个字符数组,读作“你好吗?”并且您只希望该指针指向“你好”。我传入一个char指针,当我找到它时,它读取整个数组。我尝试使用一个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
}
const char*infle(char*file)
{

cout这与指针的大小无关。指针对于特定类型总是具有相同的大小。

Strtok可能是最好的解决方案(使用Strtok的代码将在每次遇到空格、一个“,”、一个点或一个“-”时将字符串分成子字符串)


来源:

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

Strtok可能是最好的解决方案(使用Strtok的代码将在每次遇到空格、一个“,”、一个点或一个“-”时将字符串分成子字符串)


资料来源:

这样做会容易得多

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

  // strncpy(file, file,  j);

这样做会容易得多

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

  // strncpy(file, file,  j);
使用会让你的生活更轻松。
用“”作为分隔符拆分字符串,然后打印从strtok

获取的第一个元素,使用它可能会使您的生活更轻松。
使用“”作为分隔符拆分字符串,然后打印从
strtok

获得的第一个元素,使用“strtok”,例如请参见使用“strtok”,例如请参见
strncpy()
如果源字符串的第一个
j
字节中没有空终止符,则不会附加空终止符。在您的情况下,没有空终止符

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

for (j = 0; j < 500; j++) {
  if (file[j] == ' ') {
    file[j] = '\0';
    break;
  }
}
(j=0;j<500;j++)的
{
如果(文件[j]=''){
文件[j]='\0';
打破
}
}
strncpy()
如果源字符串的第一个
j
字节中没有空终止符,则不会附加空终止符。在您的情况下,没有空终止符

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

for (j = 0; j < 500; j++) {
  if (file[j] == ' ') {
    file[j] = '\0';
    break;
  }
}
(j=0;j<500;j++)的
{
如果(文件[j]=''){
文件[j]='\0';
打破
}
}
首先,避免Strutk(就像它大部分是瘟疫)。C中的不愉快,但有时是正当的。不过,我还没有看到在C++中使用它的理由。
其次,处理这个问题的最简单方法(假设您使用的是C++)可能是使用stringstream:

void infile(char const *file) 
{
    std::strinstream buffer(file);
    std::string word;
    buffer >> word;
    std::cout << word;
}
void填充(字符常量*文件)
{
std::strinstream缓冲区(文件);
字符串字;
缓冲区>>字;
STD:首先,避免Sttok(就像它大部分是瘟疫一样)。C中的不愉快,但有时是正当的。不过我还没有看到在C++中使用它的理由。
其次,处理这个问题的最简单方法(假设您使用的是C++)可能是使用stringstream:

void infile(char const *file) 
{
    std::strinstream buffer(file);
    std::string word;
    buffer >> word;
    std::cout << word;
}
void填充(字符常量*文件)
{
std::strinstream缓冲区(文件);
字符串字;
缓冲区>>字;
std::cout如果你问的是“我可以动态调整这个指针指向的内存块的大小吗”,那么…不,不。(你必须创建一个所需大小的新块,然后复制字节,删除第一个块,等等)

如果您正试图“打印第一个单词”,则将空格位置的字符设置为0。然后,当您输出file*指针时,您将只获得第一个单词(直到\0为止的所有内容)。(请阅读以了解有关为什么这样做的详细信息。)

但这一切都取决于你正在做的事情中有多少是一个示例来演示你试图解决的问题。如果你真的在“拆分字符串”,那么你至少会想查看以使用它。

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

如果您正试图“打印第一个单词”,则将空格位置的字符设置为0。然后,当您输出file*指针时,您将只获得第一个单词(直到\0为止的所有内容)。(请阅读以了解有关为什么这样做的详细信息。)


但这一切都取决于你正在做的事情中有多少是一个例子来演示你正在试图解决的问题。如果你真的要“拆分字符串”,那么你至少要查看以使用它。

为什么不一次输出每个字符,然后在碰到空格后中断呢

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;
}
const char*infle(char*file)
{

cout为什么不一次输出每个字符,然后在碰到空格后中断呢

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;
}
const char*infle(char*file)
{

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

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

{ 'f', 'o', 'o', ' ', 'b', 'a', 'r', '\0' }
如果要将字符串从
“foo bar”
更改为仅
“foo”
,一种方法是将空格字符替换为空字符:

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

既然你在使用C++,那么你最好使用<代码> STD::String ;它更强大和更灵活,并且可以让你摆脱。

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 = '\0';
std::copy(file, std::find(file, file+500, ' '),
          std::ostream_iterator<char>(std::cout, ""));