从字符串中打印一个单词

时间:2015-01-26 17:26:30

标签: c

我想打印一些字符串中的第三个单词。

在下面的例子中 - 它有效,但是 - 它可以做成其他更好的方式吗?

#include <stdio.h>
#include <string.h>

char str1[20] = "This is string";
int a, b = 0, nums = 1;
char sec[20];

int main()
{
    for (a = 0; a <= strlen(str1); a++) {

        if ( str1[a] != ' ')
        {
            printf ("%c", str1[a]);

           if (nums == 3)
            {
                sec[b] = str1[a];
                ++b;
            }

        } else {
            printf ("\n");
            ++nums;
        }
    }

    printf ("\n\n%s\n", str1);
    printf ("Total words count: %d\n", nums);

    printf("Third word: %s\n", sec);

    return 0;

}

可能是 - *pointers,而不是arrays[],还是其他什么?

另外 - 在 C 中使用嵌套的if运算符是个好主意吗?

2 个答案:

答案 0 :(得分:4)

也许这不是最优雅的解决方案,但您可以使用strtok()。假设你的所有单词都用空格分隔,那么这只是strtok的x次。我只是快速地将这个东西扔在一起,但它应该可以正常工作,我希望。

#include <string.h>
#include <stdio.h>

int main( void ) {
    char str[] = "This is a string\n";
    char *token;
    int i;
    token = strtok( str, " ");
    i = 1;
    while( token != NULL ) {
        if( 3 == i ) {
            fprintf( stdout, "%s\n", token );
            fflush( stdout );
        }
        token = strtok(NULL, " ");
        i++;  // <-- this was missing
    }
    return 0;
}

答案 1 :(得分:1)

使用"%n找到要搜索的子字符串的末尾。

不需要修改或复制源字符串。

void Print_Nth_word(const char *s, unsigned n) {
  if (n > 0) {
    int left;
    int right;
    while (1) {
      left = right = 0;
      sscanf(s, " %n%*s%n", &left, &right);
      if (right <= left) return;  // no sub-string (word) found
      if (--n == 0) break;
      s += right;
    }
    printf("%.*s\n", right - left, &s[left]);
  }
}

" %n%*s%n"详细信息:
" "略去空格。
"%n"保存当前扫描的偏移量 "*s"扫描,但不保存非空格。 (一个字)

"%.*s", right - left, &s[left]详细信息:打印&s[left]最多right - left个字符。