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;
}