我收到了一个用户输入一行文字的任务。当程序到达逗号时,程序会分割每个单词。一旦完成,它只需在新行上打印出每个单词。例如:
请输入一行文字: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
它只会打印出来:
羊肉
有什么建议吗?
答案 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;可以被找寻到。然后,当然,只有最后一个逗号后的符号离开。 你应该用逗号检查当前符号,如果没有 - 把它放到临时字符串中。只要它逗号 - 打印那个临时字符串。