方案:如何找到一个字符在字符串中的位置

Scheme: How to find a position of a char in a string

我正在尝试查找等于某个字符的字符串的索引,但我似乎可以弄清楚。 这是我到目前为止得到的,但它不起作用...

(define getPos 
  (lambda ()
    (define s (apply string-append myList))
    (getPosition pos (string->list s))))

(define getPosition 
  (lambda (position s)
    (if (and (< position (length s)) (equal? (car s) #\space)) 
        ((set! pos (+ pos 1)) (getPosition (cdr s) pos));increment the positon and continue the loop
        pos)));else

(define length
  (lambda (s);the value s must be coverted to a string->list when passed in
    (cond
      ((null? s) 0)
      (else (+ 1 (length (cdr s)))))))

解决方案很简单:我们必须测试列表中的每个字符,直到我们 运行 没有元素或者我们找到第一次出现的字符,跟踪我们所在的位置。

你提出的解决方案看起来很奇怪,在 Scheme 中我们尽量避免 set! 和其他改变数据的操作 - 方法是使用递归遍历字符列表。喜欢这样的东西是首选:

(define (getPosition char-list char pos)
  (cond ((null? char-list) #f)              ; list was empty
        ((char=? char (car char-list)) pos) ; we found it!
        (else (getPosition (cdr char-list) char (add1 pos))))) ; char was not found

对于基于 0 的索引,可以这样使用,将字符串转换为字符列表并初始化 0 中的位置:

(getPosition (string->list "abcde") #\e 0)
=> 4

当然,我们可以通过使用现有程序做得更好 - 这里有一个更惯用的解决方案:

(require srfi/1) ; required for using the `list-index` procedure

(define (getPosition string char)
  (list-index (curry char=? char) 
              (string->list string)))

(getPosition "abcde" #\e)
=> 4

for的解决方案:

#lang racket

(define (find-char c s)
  (for/first ([x s]              ; for each character in the string c
              [i (in-naturals)]  ; counts 0, 1, 2, ...
              #:when (char=? c x))
    i))

(find-char #\o "hello world")
(find-char #\x "hello world")

输出:

4
#f