【问题标题】:Print one word from string从字符串中打印一个单词
【发布时间】:2015-01-26 17:26:30
【问题描述】:

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

在下面的示例中 - 它可以工作,但是 - 可以用其他更好的方式制作吗?

#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 运算符是个好主意吗?

【问题讨论】:

标签: c


【解决方案1】:

也许这不是最优雅的解决方案,但您可以使用strtok()。假设您所有的单词都用空格分隔,那么这只是 strtok'ing 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;
}

【讨论】:

  • 请注意 strtok 正在更改原始字符串。你需要在调用 strtok 之前复制它。
  • 您在循环中缺少i++。尝试编辑,但我的编辑正在等待同行评审。
  • 确实如此。仅当您不再使用原始字符串时才使用 strtok() ,或者将其复制到某个临时变量中,然后才可以使用。
【解决方案2】:

使用"%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, &amp;s[left] 详细信息:打印 &amp;s[left] 最多 right - left 个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2019-06-28
    • 2021-11-02
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多