【问题标题】:C pointers and arraysC 指针和数组
【发布时间】:2015-03-27 05:49:36
【问题描述】:

在这段代码中,除了 main 之外,我还有一个函数,它在字符串(句子)中查找特定字符并返回指向它的指针,否则返回 NULL:

char *position (char letter, char *sentence){
int i=0;
while (*(sentence+i) != '\0') {
    if (toupper(*(sentence+i)) == toupper (letter))
      return (sentence+i);
    ++i;
}
return NULL;}

这里我都清楚了。

在主函数中,我必须使用前一个函数(位置)来查找特定字母在特定句子中出现的次数。

int main (void){
char sentence [200+1];
char letter;
char *pos = sentence;
int counter=0;
gets(sentence);
scanf("%c", &letter);
while (pos != NULL){
    pos = position (letter, pos);
    if (pos != NULL){
        ++counter;
        pos +=1;
    }
}
return 0;   
}

我不清楚 pos 变量在设置后究竟是什么以及最后的 while 循环如何工作?

编辑:忘记在function() 中初始化变量i,谢谢指出

【问题讨论】:

  • 你没有在position()中初始化i
  • pos 通过指针运算递增。是字符串中的当前位置。
  • 不要使用gets(),而是使用fgets()

标签: c arrays pointers while-loop


【解决方案1】:

让我们做一个小例子:你有字符串“abaab”并且你正在寻找字母b。如您所知,C 字符串总是以 '\0' 结尾。所以一开始你的 pos 代表整个字符串。

abaab\0 //pos represents ="abaab"
| 
pos

之后你调用你的函数:postiton(pos, 'b')。 Pos 现在指向第二个字母。而这个 pos 只代表较小的字符串“baab”。

abaab\0 //pos represents="baab"
 | 
pos

在 ++pos 之后;你遇到了这种情况:(pos代表一个较小的字符串)

abaab\0 //pos represents ="aab"
  | 
 pos

当你现在再次调用位置函数时。 pos 将指向下一个'b'。当然,字符串又变短了。

abaab\0 //pos represents ="b"
    | 
   pos

递增位置:

abaab\0 //pos represents =""
     | 
    pos

再次调用位置函数将返回NULL,因为没有'b'。当此函数返回 NULL 时,while 函数结束。

【讨论】:

  • 感谢您的快速而有帮助的回复,我现在明白了!
【解决方案2】:

我不清楚 pos 变量在设置后究竟是什么以及最后的 while 循环如何工作?

您的代码包含很多错误,但如果您的问题正是我所引用的,那么一个简单的答案是:

possentence 字符串中的指针。开始指向sentence 指向的位置并移开以到达字符串的末尾。

position()取一个起点end返回找到letter的点,否则返回NULL:所以当你写pos = position (letter, pos);时,pos移动到letter位置。之后pos +=1; 移动到下一个元素(移动一个字符的指针)。 当有任何字母position() 返回NULLwhile 循环终止。

【讨论】:

    【解决方案3】:

    pos 用char *pos = sentence; 初始化,这让它指向sentence 中的第一个字符,因为在大多数表达式中,数组“衰减”到指针,比如这个。之后,它指向sentence内部的元素,因为position()返回sentence+i,这是句子第一个元素的地址加上偏移量i。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2023-03-17
      相关资源
      最近更新 更多