很遗憾,他们没有列出最适合此任务的函数: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) {
printf("%.*s\n", (int)(next - curr), curr);
curr = next + 1;
}
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) {
*next++ = '\0';
printf("%s\n", curr);
curr = next;
}
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;
}
编辑:如果两个逗号挨在一起表示它们是一个单词中的普通逗号,请尝试以下方法:
#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) {
if (next[1] == ',') {
next++;
printf("%.*s", (int)(next - curr), curr);
} else {
printf("%.*s\n", (int)(next - curr), curr);
}
curr = next + 1;
}
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';
}
n = 0;
array[n++] = p = line;
while ((p = strchr(p, ',')) != NULL) {
*p++ = '\0';
array[n++] = p;
}
for (i = 0; i < n; i++) {
printf("%s\n", array[i]);
}
}
return 0;
}
strtok
。 - Jean-François Fabrestrtok()
会将任何逗号序列视为单个逗号。此外,要避免使用strncpy()
。 - chqrlierealloc
和strdup
创建一个动态字符串数组。你离解决方案还有很长的路要走(而且所有的答案都是错误的,我已经删除了我的简单答案)。 - Jean-François Fabre