在处理字符串时,我通常不使用指针字符,但是我通常认为它们更好,因为我可以打印整个字符串而无需迭代每个字符。
无论如何,由于我不使用它们,所以我真的不知道这两者是如何相互作用的。运行以下代码时,程序崩溃了,所以我不知道该怎么办,因为没有错误。
int main(){
char s[]="abcde";
char *p;
for(unsigned int i=0;i<strlen(s);i++)
strcat(p,s+i);
cout<<*p;
}
我尝试将两个字符串都表示为指针,但没有任何改变。仅当我尝试打印第二个数组时它才会崩溃。我尝试了* p ++ = * s或在Google上找到的类似内容,但仍然崩溃,我在做什么错?
答案 0 :(得分:2)
指针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';
答案 1 :(得分:1)
您没有将内存分配给指针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;
}