Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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处理字符串和SEGFAULT_C_Pointers_Segmentation Fault - Fatal编程技术网

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]={