我想打印一些字符串中的第三个单词。
在下面的例子中 - 它有效,但是 - 它可以做成其他更好的方式吗?
#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
运算符是个好主意吗?
答案 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
个字符。