Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 拆分一个字符串并打印出每个单词_C - Fatal编程技术网

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

C 拆分一个字符串并打印出每个单词,c,C,我接到一个任务,用户在其中输入一行文本。当每个单词到达逗号时,程序将其拆分。一旦这样做了,它只需将每个单词打印在新行上。例如: 请输入一行文本:Mary,had,a,little,lamb Mary had a little lamb 我无法使用strok(),因为此任务不允许使用它。我可以使用: printf(),fprintf(),malloc(),calloc(),realloc(),free(),fgets(),snprintf(),strncpy(),strncat(),strncm

我接到一个任务,用户在其中输入一行文本。当每个单词到达逗号时,程序将其拆分。一旦这样做了,它只需将每个单词打印在新行上。例如:

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

Mary
had
a
little
lamb
我无法使用
strok()
,因为此任务不允许使用它。我可以使用:

printf()
fprintf()
malloc()
calloc()
realloc()
free()
fgets()
snprintf()
strncpy()
strncat(),
strncmp()
strncmp(),
str

到目前为止,我已经做了:

   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]);
   }
inti;
字符行[256];
char*next;
printf(“输入字符串\n”);
fgets(第256行,标准输入);
char*curr=行;
while((next=strchr(curr,,)!=NULL){
curr=next+1;
}
int len=strlen(当前);
对于(i=0;i
所以现在如果我的字符串是:
Mary,had,a,little,lamb

Mary
had
a
little
lamb
它只会打印出:

羔羊


有什么建议吗?

在这个循环中,您将curr切换到last','

   while ((next = strchr(curr, ',')) != NULL) {
      curr = next + 1;
   }
你在别人找你的时候做。然后,当然,只剩下最后一个逗号后面的符号了。
您应该用逗号检查当前符号,如果不是,则将其置于临时字符串中。一旦用逗号打印临时字符串。

很遗憾,他们没有为此任务列出最合适的函数:
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;
}
编辑:如果相邻的两个逗号表示单词的文字逗号部分,请尝试以下操作:

#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;
}
#包括
#包括
内部主(空){
字符行[256];
printf(“输入字符串\n”);
if(fgets(第256行,标准输入)){
char*curr=行;
char*next;
while((next=strchr(curr,,)!=NULL){
/*找到分隔符:在curr和next之间打印单词*/
如果(下一个[1]==','){
next++;
printf(“%.*s”,(int)(下一个-货币),货币);
}否则{
printf(“%.*s\n”,(int)(下一个-curr),curr);
}
curr=next+1;
}
/*打印最后一个单词*/
printf(“%s”,货币);
}
返回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;
}
#包括
#包括
内部主(空){
字符行[256];
字符*数组[256];
inti,n;
printf(“输入字符串\n”);
if(fgets(第256行,标准输入)){
char*p=strchr(第“\n”行);
如果(p!=NULL){
*p='\0';/*如果有换行符,请去掉换行符*/
}
/*将行拆分为一个单词数组*/
n=0;
数组[n++]=p=line;
而((p=strchr(p,,)!=NULL){
*p++='\0';
数组[n++]=p;
}
/*打印单词*/
对于(i=0;i
while循环将用尽字符串中的所有逗号;然后你打印最后一个字,每行1个字符。顺便说一下,这一次,不被允许使用函数是件好事。远离<代码> Strutok <代码>。好建议,请注意<代码> Stotok()/Case>会考虑逗号的任何序列相当于一个逗号。也要远离
strncpy()
。您应该更强调“程序在到达逗号时分割每个单词”,字符串打印只是为了检查它是否有效,但真正困难的任务是使用
realloc
strdup
创建字符串的动态数组。你离解决方案还有好几英里远(而且所有的答案都是错的,我删除了我过于简单的答案)@Karth:享受你新的投票特权吧。你现在可以投票,也可以接受答案(如果你认为其他答案有帮助,也可以投票,但你不必这么做)。非常感谢你的意见!您的第一个解决方案非常有效!如果字符串中的逗号相邻,而我想打印出第二个逗号,该怎么办?例如:123451234、、、123、12、1,它打印出“1234512341231”,@Karth:如果字符串包含两个相邻的逗号,则表示有一个空单词,产生一个空行。如果您希望它表示一个文字逗号,那么可以根据发布的内容修改代码。
#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;
}