拆分字符串并打印出每个单词

时间:2017-02-25 22:23:06

标签: c

我收到了一个用户输入一行文字的任务。当程序到达逗号时,程序会分割每个单词。一旦完成,它只需在新行上打印出每个单词。例如:

请输入一行文字:Mary,had,a,little,lamb

Mary
had
a
little
lamb

我无法使用strtok(),因为此任务不允许这样做。我可以用:

printf()fprintf()malloc()calloc()realloc()free()fgets()snprintf()strncpy()strncat()strncmp()strdup()strlen()strchr()

到目前为止,我已经完成了:

   int i;

   char line[256];
   char *next;

   printf("Enter the string\n");
   fgets(line, 256, stdin);

   char *curr = line;

   while ((next = strchr(curr, ',')) != NULL) {
      curr = next + 1;
   }

   int len = strlen(curr);

   for (i = 0; i < len; i++) {
      printf("%c", curr[i]);
   }

截至目前,如果我的字符串为:Mary,had,a,little,lamb

它只会打印出来:

羊肉

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

他们没有为此任务列出最合适的功能,这太糟糕了:strcspn()。您可以使用已发布的strchr(),但打印结果时出现问题。您可以使用%.*s格式说明符打印子字符串:

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

int main(void) {
    char line[256];

    printf("Enter the string\n");
    if (fgets(line, 256, stdin)) {
        char *curr = line;
        char *next;

        while ((next = strchr(curr, ',')) != NULL) {
            /* found a separator: print the word between curr and next */
            printf("%.*s\n", (int)(next - curr), curr);
            curr = next + 1;
        }
        /* print the last word */
        printf("%s", curr);
    }
    return 0;
}

如果你不能使用这个有点高级的printf功能,你可以这样修改字符串:

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

int main(void) {
    char line[256];

    printf("Enter the string\n");
    if (fgets(line, 256, stdin)) {
        char *curr = line;
        char *next;

        while ((next = strchr(curr, ',')) != NULL) {
            /* found a separator: replace it with '\0' */
            *next++ = '\0';
            printf("%s\n", curr);
            curr = next;
        }
        /* print the last word */
        printf("%s", curr);
    }
    return 0;
}

另请注意,您可以使用更简单的解决方案,甚至不使用缓冲区,但使用列表中不存在的getchar()putchar()

#include <stdio.h>

int main(void) {
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c == ',' ? '\n' : c);
        if (c == '\n')
            break;
    }
    return 0;
}

编辑:如果彼此相邻的2个逗号表示单词的字面逗号,请尝试以下操作:

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

int main(void) {
    char line[256];

    printf("Enter the string\n");
    if (fgets(line, 256, stdin)) {
        char *curr = line;
        char *next;

        while ((next = strchr(curr, ',')) != NULL) {
            /* found a separator: print the word between curr and next */
            if (next[1] == ',') {
                next++;
                printf("%.*s", (int)(next - curr), curr);
            } else {
                printf("%.*s\n", (int)(next - curr), curr);
            }
            curr = next + 1;
        }
        /* print the last word */
        printf("%s", curr);
    }
    return 0;
}

编辑2 鉴于您应该将字符串拆分为指针数组,代码稍微复杂一些。不需要分配数组,因为字数受输入缓冲区大小的限制:

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

int main(void) {
    char line[256];
    char *array[256];
    int i, n;

    printf("Enter the string\n");
    if (fgets(line, 256, stdin)) {
        char *p = strchr(line, '\n');
        if (p != NULL) {
            *p = '\0';   /* strip the newline if any */
        }
        /* split the line into an array of words */
        n = 0;
        array[n++] = p = line;
        while ((p = strchr(p, ',')) != NULL) {
            *p++ = '\0';
            array[n++] = p;
        }
        /* print the words */
        for (i = 0; i < n; i++) {
            printf("%s\n", array[i]);
        }
    }
    return 0;
}

答案 1 :(得分:-1)

在此循环中,您将 curr 移至最后&#39;&#39;

   while ((next = strchr(curr, ',')) != NULL) {
      curr = next + 1;
   }

你是这样做的,&#39;,&#39;可以被找寻到。然后,当然,只有最后一个逗号后的符号离开。 你应该用逗号检查当前符号,如果没有 - 把它放到临时字符串中。只要它逗号 - 打印那个临时字符串。