C处理字符串和SEGFAULT
您好,很抱歉我的英语不好。C处理字符串和SEGFAULT,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,您好,很抱歉我的英语不好。 我从C语言开始,但我没有得到很好的指针… 我搜索了类似的主题,但没有从他们那里得到,所以我创建了自己的主题。 我有一个main函数,在这里我调用函数newSpeak。 这是我的新话代码,但不是所有的… char * newSpeak ( const char * text, const char * (*replace)[2] ) { int i; char * alpha; for(i=0;i<4;i++) { alpha=strstr
我从C语言开始,但我没有得到很好的指针…
我搜索了类似的主题,但没有从他们那里得到,所以我创建了自己的主题。
我有一个main函数,在这里我调用函数newSpeak。
这是我的新话代码,但不是所有的…
char * newSpeak ( const char * text, const char * (*replace)[2] )
{
int i;
char * alpha;
for(i=0;i<4;i++)
{
alpha=strstr(text, replace[0][4]);
if(alpha[0])
strncpy (alpha,replace[1][0],10);
}
return 0;
char*newSpeak(const char*text,const char*(*replace)[2])
{
int i;
字符*α;
对于(i=0;i
strncpy (alpha,replace[1][0],10);
应该生成编译器警告(并且永远不要忽略编译器警告)
char *strncpy( char *dest, char *source, int n);
但是您正在传递它replace[1][0]
,它是一个字符。如果您传递了,它可能会工作
strncpy( alpha, &replace[1][0], 10);
即使这样,我仍然担心。可能是因为alpha
指向text
所指向的块中的内存块,这是一个const char*
,所以不允许修改该内存
编辑我认为我的第一点是错误的-我误读了你的原型。但我非常确定第二点是正确的(可能是错误的原因)
第二次编辑
可能是文本
没有分配足够的内存,无法将10个字符从替换
复制到文本中。请了解您要匹配的对象(替换[0][4]
)和正在复制的对象(替换[1][0]]
)不是同一件事;而且,您正在循环i
,但没有使用该值……让我怀疑是否有输入错误(我没有洞察力,无法理解您希望在循环之间更改什么)
您需要检查要复制到的对象的大小:
strncpy(alpha, replace[1][0], (strlen(alpha)<10)?strlen(alpha):10);
输出:
NewSpeak: hello world
length of input string is 27
allocated 28 bytes
copy OK: beta now this is a vary sally strang
alpha is 'a vary sally strang'
ii = 0; alpha now: 'a vary sally strang'
n is now 1
going to copy at most 1 characters from 'o' into 'a vary sally strang'
beta is now 'this is o vary sally strang'
alpha is 'ary sally strang'
ii = 1; alpha now: 'ary sally strang'
n is now 1
going to copy at most 1 characters from 'e' into 'ary sally strang'
beta is now 'this is o very sally strang'
alpha is 'ally strang'
ii = 2; alpha now: 'ally strang'
n is now 1
going to copy at most 1 characters from 'i' into 'ally strang'
beta is now 'this is o very silly strang'
alpha is 'ang'
ii = 3; alpha now: 'ang'
n is now 1
going to copy at most 1 characters from 'u' into 'ang'
beta is now 'this is o very silly strung'
converted: this is o very silly strung
注意-我添加了很多“无用”的输出,包括fflush(stdout);
语句。这是一种很好的方法,可以确保调试打印输出准确地显示出程序的运行距离,以及在程序崩溃之前发生了什么-如果没有fflush
,可能会丢失许多输出行(因为它们永远不会丢失)“出现在屏幕上”)
从上面可以明显看出,如果替换字符串的长度与它们替换的字符串的长度不同,您将得到一些奇怪的覆盖(我将搜索和替换字符串的长度都保留为1,但没有理由这样做)
我希望这有帮助!线路
strncpy (alpha,replace[1][0],10);
alpha=strstr(text, replace[0][4]);
if(alpha[0])
// looks crashy
应该生成编译器警告(并且永远不要忽略编译器警告)
char *strncpy( char *dest, char *source, int n);
但是您正在传递它replace[1][0]
,它是一个字符。如果您传递了,它可能会工作
strncpy( alpha, &replace[1][0], 10);
即使这样,我仍然担心。可能是因为alpha
指向text
所指向的块中的内存块,这是一个const char*
,所以不允许修改该内存
编辑我认为我的第一点是错误的-我误读了你的原型。但我非常确定第二点是正确的(可能是错误的原因)
第二次编辑
可能是文本
没有分配足够的内存,无法将10个字符从替换
复制到文本中。请了解您要匹配的对象(替换[0][4]
)和正在复制的对象(替换[1][0]]
)不是同一件事;而且,您正在循环i
,但没有使用该值……让我怀疑是否有输入错误(我没有洞察力,无法理解您希望在循环之间更改什么)
您需要检查要复制到的对象的大小:
strncpy(alpha, replace[1][0], (strlen(alpha)<10)?strlen(alpha):10);
输出:
NewSpeak: hello world
length of input string is 27
allocated 28 bytes
copy OK: beta now this is a vary sally strang
alpha is 'a vary sally strang'
ii = 0; alpha now: 'a vary sally strang'
n is now 1
going to copy at most 1 characters from 'o' into 'a vary sally strang'
beta is now 'this is o vary sally strang'
alpha is 'ary sally strang'
ii = 1; alpha now: 'ary sally strang'
n is now 1
going to copy at most 1 characters from 'e' into 'ary sally strang'
beta is now 'this is o very sally strang'
alpha is 'ally strang'
ii = 2; alpha now: 'ally strang'
n is now 1
going to copy at most 1 characters from 'i' into 'ally strang'
beta is now 'this is o very silly strang'
alpha is 'ang'
ii = 3; alpha now: 'ang'
n is now 1
going to copy at most 1 characters from 'u' into 'ang'
beta is now 'this is o very silly strung'
converted: this is o very silly strung
注意-我添加了很多“无用”的输出,包括fflush(stdout);
语句。这是一种很好的方法,可以确保调试打印输出准确地显示出程序的运行距离,以及程序崩溃前的情况-如果没有fflush
,则可能会丢失许多输出行(因为它们永远不会丢失)在屏幕上)
从上面可以明显看出,如果替换字符串的长度与它们替换的字符串的长度不同,您将得到一些奇怪的覆盖(我将搜索和替换字符串的长度都保留为1,但没有理由这样做)
我希望这有帮助
alpha=strstr(text, replace[0][4]);
if(alpha[0])
// looks crashy
曼斯特:
这些函数返回指向子字符串开头的指针,
如果未找到子字符串,则为NULL
编辑:
很难说出你想做什么,但下面会找到你的代码的任意修改。如果是我的程序,我会写得非常不同。我提到这一点是因为我不希望有人读到这篇文章,并且认为这是应该做的
#include <stdio.h>
#include <string.h>
void newSpeak (char *text, const char *replace[4][2])
{
int i, j;
char *alpha;
for (i = 0; i < 4; i++) {
if (alpha = strstr(text, replace[i][0])) {
for (j = 0; alpha[j] && replace[i][1][j]; j++)
alpha[j] = replace[i][1][j];
}
}
}
int main ()
{
char buf[100] = "abc";
const char *replace[4][2] = {
{ "a", "e" },
{ "b", "f" },
{ "c", "g" },
{ "d", "h" },
};
newSpeak(buf, replace);
puts(buf);
}
#包括
#包括
void newSpeak(字符*文本,常量字符*替换[4][2])
{
int i,j;
字符*α;
对于(i=0;i<4;i++){
如果(alpha=strstrstr(文本,替换[i][0])){
对于(j=0;alpha[j]&替换[i][1][j];j++)
α[j]=替换[i][1][j];
}
}
}
int main()
{
char buf[100]=“abc”;
常量字符*替换[4][2]={
{“a”,“e”},
{“b”,“f”},
{“c”,“g”},
{“d”,“h”},
};
新语(buf,替换);
put(buf);
}
曼斯特:
这些函数返回指向子字符串开头的指针,
如果未找到子字符串,则为NULL
编辑:
很难说出你想做什么,但下面会找到你的代码的任意修改。如果是我的程序,我会写得非常不同。我提到这一点是因为我不希望有人读到这篇文章,并且认为这是应该做的
#include <stdio.h>
#include <string.h>
void newSpeak (char *text, const char *replace[4][2])
{
int i, j;
char *alpha;
for (i = 0; i < 4; i++) {
if (alpha = strstr(text, replace[i][0])) {
for (j = 0; alpha[j] && replace[i][1][j]; j++)
alpha[j] = replace[i][1][j];
}
}
}
int main ()
{
char buf[100] = "abc";
const char *replace[4][2] = {
{ "a", "e" },
{ "b", "f" },
{ "c", "g" },
{ "d", "h" },
};
newSpeak(buf, replace);
puts(buf);
}
#包括
#包括
void newSpeak(字符*文本,常量字符*替换[4][2])
{
int i,j;
字符*α;
对于(i=0;i<4;i++){
如果(alpha=strstrstr(文本,替换[i][0])){
对于(j=0;alpha[j]&替换[i][1][j];j++)
α[j]=替换[i][1][j];
}
}
}
int main()
{
char buf[100]=“abc”;
常量字符*替换[4][2]={