7
#include <stdio.h>
int
main() {
    char string[] = "my name is geany";
    int length = sizeof(string)/sizeof(char);
    printf("%i", length);
    int i;
    for ( i = 0; i<length; i++ ) {

    }   
    return 0;
}

如果我想分别打印“my”“name”“is”和“geany”,那我该怎么办。我正在考虑使用分隔符,但我不知道如何在 C 中执行此操作

4

5 回答 5

11
  1. 以指向字符串开头的指针开始
  2. 逐个字符迭代,寻找你的分隔符
  3. 每次找到一个时,您都会从长度不同的最后一个位置得到一个字符串 - 用它做你想做的事
  4. 将新的起始位置设置为分隔符 + 1,然后转到步骤 2。

在字符串中剩余字符时执行所有这些操作...

于 2012-09-13T16:00:43.873 回答
2

我需要这样做,因为正在运行的环境有一个受限库,缺少strtok. 以下是我如何拆分连字符分隔的字符串:

     b = grub_strchr(a,'-');
     if (!b)
       <handle error>
     else
       *b++ = 0;

     c = grub_strchr(b,'-');
     if (!c)
       <handle error>
     else
       *c++ = 0;

在这里,a以复合字符串 开始生命"A-B-C",在代码执行后,有三个以空字符结尾的字符串 , ,a它们的值分别为,和。是代码对缺少的分隔符做出反应的占位符。bc"A""B""C"<handle error>

请注意,像 一样strtok,通过将分隔符替换为 NULL 来修改原始字符串。

于 2014-12-01T20:22:18.203 回答
1

这会在换行符处断开字符串并修剪报告字符串的空格。它不会像 strtok 那样修改字符串,这意味着它可以用于const char*来源不明的字符串,而 strtok 不能。不同之处在于begin/end是指向原始字符串字符的指针,因此不像 strtok 给出的那样以空字符结尾的字符串。当然,这使用静态本地,因此不是线程安全的。

#include <stdio.h> // for printf
#include <stdbool.h> // for bool
#include <ctype.h> // for isspace

static bool readLine (const char* data, const char** beginPtr, const char** endPtr) {
    static const char* nextStart;
    if (data) {
        nextStart = data;
        return true;
    }
    if (*nextStart == '\0') return false;
    *beginPtr = nextStart;

    // Find next delimiter.
    do {
        nextStart++;
    } while (*nextStart != '\0' && *nextStart != '\n');

    // Trim whitespace.
    *endPtr = nextStart - 1;
    while (isspace(**beginPtr) && *beginPtr < *endPtr)
        (*beginPtr)++;
    while (isspace(**endPtr) && *endPtr >= *beginPtr)
        (*endPtr)--;
    (*endPtr)++;

    return true;
}

int main (void) {
    const char* data = "  meow ! \n \r\t \n\n  meow ?  ";
    const char* begin;
    const char* end;
    readLine(data, 0, 0);
    while (readLine(0, &begin, &end)) {
        printf("'%.*s'\n", end - begin, begin);
    }
    return 0;
}

输出:

'meow !'
''
''
'meow ?'
于 2013-03-28T15:19:39.057 回答
0
use strchr to find the space.
store a '\0' at that location.
the word is now printfable.

repeat
    start the search at the position after the '\0'
    if nothing is found then print the last word and break out
    otherwise, print the word, and continue the loop
于 2012-09-13T16:00:13.753 回答
-2

重新发明轮子通常是个坏主意。学会使用实现函数也是一个很好的训练。

#include <string.h>

/* 
 * `strtok` is not reentrant, so it's thread unsafe. On POSIX environment, use
 * `strtok_r instead. 
 */
int f( char * s, size_t const n ) {
    char * p;
    int    ret = 0;
    while ( p = strtok( s, " " ) ) { 
        s += strlen( p ) + 1; 
        ret += puts( p ); 
    }
    return ret;
}
于 2012-09-13T16:31:36.950 回答