【问题标题】:Dumb questions: strcat and char pointers愚蠢的问题:strcat 和 char 指针
【发布时间】:2018-07-15 20:14:58
【问题描述】:

在处理字符串时我通常不使用指针字符,但我通常认为它们更好,因为我可以打印整个字符串而无需迭代每个字符。

无论如何,因为我不使用它们,所以我真的不知道这两者是如何相互作用的。运行以下代码时程序崩溃,所以我不知道该怎么办,因为没有错误。

int main(){
char s[]="abcde";
char *p;
for(unsigned int i=0;i<strlen(s);i++)
    strcat(p,s+i);
cout<<*p;
}

我尝试将两个字符串都表示为指针,但它没有改变任何东西。只有当我尝试打印第二个数组时它才会崩溃。我尝试了 *p++=*s 或我在谷歌上找到的类似内容,但它仍然崩溃,我做错了什么?

【问题讨论】:

  • strcat 的第一个参数必须是指向char 数组的指针,该数组大到足以容纳结果字符串(并且它本身必须是一个以空字符结尾的字符串)。因为这里不是这种情况(你有一个未初始化的指针p)你正在调用 undefined behavior
  • @UnholySheep 我认为这是一个答案,而不是评论:)
  • 那我该怎么做呢?我尝试将 *p char 初始化为 '/0',但也没有用。
  • 老实说,我仍然有些困惑 for 循环应该实现什么 - 如果它可以工作,它将导致像 "abcdebcdecdedee" 这样的字符串 - 这真的是你想要的吗?跨度>
  • 真的不清楚你想做什么。我的意思是代码崩溃的原因很明显,但除非你说你想让代码做什么,否则谁能修复它?

标签: c++ string pointers


【解决方案1】:

指针 p 不指向任何地方,你需要为第二个数组保留内存。例如,

char *p = new char [strlen(s) + 1];

for 循环中的 strcat 也不是复制字符串的最佳方式。试试

strcpy(p, s);

(当然是在为 p 分配内存之后)。

补充:如果需要使用strcat代替strcpy,需要用空字符串初始化字符串p,即:

char *p = new char [strlen(s) + 1];
*p = '\0';

【讨论】:

  • strcatfor 循环中的使用不仅仅是字符串的单个副本(这就是为什么我要求 OP 澄清他们正在尝试做什么)
  • 糟糕,我忽略了 s 被声明为 []。固定
  • 我并没有尝试在循环中使用 strcat 做任何事情,只是测试该函数如何使用指针,碰巧将它放在一个 foo 循环中,没有特定目的。
  • 你的计算有误。我们需要len - strlen(s); char *p = new char [len * (len+1) / 2 + 1];,因为字符串的末尾会被复制len 次。
【解决方案2】:

你没有为指针 p 分配内存。当您调用 strcat 而不分配内存时,您当然会遇到分段错误,因为 strcat 将尝试通过指针 p 写入内存指针。

您不需要用于连接字符串的 for 循环。 strcat 函数将完整的字符串复制到 p 指向的内存中。

如果你想打印整个字符串,不要遵循指针 p fi 你想打印整个字符串,遵循导致只打印字符串的第一个字符。

#include<iostream>
#include<cstring>

int main(){
char s[]="abcde";
//Allocating memory to so that p points valid memory.
char concatenatedString[50] = "";
//Initializing pointer to allocated memory.
char *p = concatenatedString;
// for(unsigned int i = 0;i < strlen(s); i++) //Not required.
    strcat(p,s);
//Here don't dereference if you want to print whole string.
std::cout<<p;
} 

【讨论】:

  • 所以有必要使用一个字符数组,然后让指针指向那个字符数组吗?没有其他方法吗,我很确定我已经看过一些教程,其中只有 char 指针的声明,它们就像字符数组一样工作,不知何故,我从来没有得到那个东西,这就是为什么我通常改为使用字符数组。
  • 不,它们在指向有效分配的内存后作为字符数组工作。在传递给 strcat() 之前,始终指向的指针应指向有效内存。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2011-01-20
相关资源
最近更新 更多