使用指针修改字符串

时间:2013-02-08 05:47:26

标签: c pointers segmentation-fault

所以我有一个函数,它将一个Pointer指向一个'Strings'数组(我理解字符串只是内存块后跟'\ 0')。由于字符串已经是指向字符串第一个字节的指针,因此我的指针实际上是一个** doublePointer。然而,我对Ying Yang进行了分离,老实说,我不知道在低级视图中发生了什么。这是我的下面的代码,它的功能是读取字符并大写第一个单词的第一个字母(在字符串中)和一段时间之后。

    void autocaps(char ** words)
    {

    /* Add code here */
    //Period Boolean
    bool next=false;
    //First Word Boolean
    bool fcap=true;
    //Counter Variable
    int i=0;
    int j=0;
    //Second Pointer
    char** wordx = words;

    //LowerCase Bomb & Period Flagging
    while(wordx[i][j]!='\0'){
      while(wordx[i][j]!='\0'){
       //A-Z Filter
       if((wordx[i][j]>='A')&&(wordx[i][j]<='Z')){
      wordx[i][j]+=32;
       }
       if(wordx[i][j]=='.'){
      next=true;
       }
      j++;
      }
    i++;
    }

 i=0;
 j=0;
 //Cap First Word & Cap Post Period
 while(words[i]!='\0'){
   while(words[i][j]!='\0'){
    //a-z Filter
    if((words[i][j]>=97)&&(words[i][j]<=122)){
  if(fcap){
    words[i][j]-=32;
    fcap=false;
  }
  if(next){
    words[i][j]-=32;
  }
    }
    j++;
  }
 i++;
}
return;

}

当我打印通过参数传递的原始指针时,我是段错误的。如果有人可以向我解释这个问题的低级概念,因为我很困惑,我在各地投掷三星和四星,我甚至不知道它是否让我更接近或更远地调试我的代码。

谢谢!!

2 个答案:

答案 0 :(得分:0)

你说的是'字符串数组',但是基于你的代码和你的意图(大写第一个字符和句点之后)我将假设你打算在你传递给函数的单个字符串上工作。

字符串只是一个字符数组,后跟一个0值。你想要做的是遍历字符数组。从字符指针获取要取消引用指针的字符。这就是为什么你在我们实际检查字符串中的字符时到处看到'* words'的原因。

双重,三重和四重指针让你离解决方案更远。

这是一个重新设计的样本:

void autocaps(char* words)
{
  bool fcap=true; /* true so first letter is made cap */

  while (*words != '\0') 
  {
    if (fcap)
    {
        /* capitalize */
        if ((*words >= 'a') && (*words <= 'z'))
        {
            *words -= 32;
        }

        fcap = false;
    }
    else
    {
        /* not cap */
        if ((*words >= 'A') && (*words <= 'Z'))
        {
            *words += 32;
        }
    }

    /* period - cap next letter */
    if (*words == '.')
    {
        fcap = true;
    }

    /* step to next character in array */
    words++;
  }

  return;
}

答案 1 :(得分:0)

我正在将字符串数组初始化为字符串,例如:

char *words[2] = {"hello", "world"};

然后在第一次到达时会出现分段错误

**words+=32;

因为您正在尝试修改只读位置。

你应该像这样初始化字符串:

char word1[] = {'h', 'e', 'l', 'l', 'o', 0};
char word2[] = {'w', 'o', 'r', 'l', 'd', 0};
char *words[] = {word1, word2};

另一个问题确实是

*words++;

您不希望这样做有两个原因:

  1. 正如其他海报所提到的,++优先于解除引用运算符,因此您实际上是将字数组从一个字符串递增到下一个字符串,而不是一个字符递增到下一个字符串。
  2. 解除引用操作符则没有任何影响。
  3. 现在,如果你想进入下一个角色,你不想这样做:

    (*words)++
    

    因为现在你实际上是在更改单词数组中的指针,而你不想这样做。