我在C中输入字符串的单独行中打印每个单词时遇到问题。我所做的作业中的问题表明:
以句子作为输入,并在单独的行中打印单词。
我的代码:
#include<stdio.h>
int main()
{
int i;
char s[100];
scanf("%s", s);
for(i=0; s[i]!='\0'; i++)
{
printf("%c", s[i]);
if(s[i]==' ')
{
printf("\n");
}
}
}
任何帮助都将不胜感激。
答案 0 :(得分:4)
在您的代码中,
printf("%s", s[i]);
错了。将其更改为
printf("%c", s[i]);
因为,您正在尝试打印char
值。 char
的转化说明符为%c
。
注意:永远记住,使用错误的转化说明符会导致undefined behaviour。
此外,在使用scan()
进行%s
时,您无法将整个空格分隔的输入读取为单个字符串。从手册页中,
%S
匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节(
'\0'
),它是自动添加的。 输入字符串在空格或最大字段宽度处停止,以先发生者为准。
您需要使用fgets()
来完成这项工作。
那就是说,
scanf("%s", s);
到scanf("99%s", s);
,以避免因输入的字符串长于99 char
而导致缓冲区溢出。main()
的正确签名是int main(void)
。答案 1 :(得分:2)
Rookie,使用面向行的输入(如fgets
或getline
)通常是阅读文本行的正确方法。然而,当对单个字符进行简单分割时,一次读取字符可能是有利的。
在您的情况下,如果您的任务是阅读最多100个字符的句子并在单独的行上打印出句子的单词,那么没有理由将该句子读入数组并存储单词。您可以简单地读取/打印每个字符,直到读取空格,然后打印newline
而不是空格。阅读/打印一直持续到达到100个字符,遇到newline
或EOF
:
#include <stdio.h>
#define MAXC 100
int main(void) {
int c = 0;
size_t n = 0;
printf ("\n Enter a sentence.\n\n input: ");
/* read up to 100 characters from stdin, print each word on a line */
while (n < MAXC && (c = getchar ()) != EOF && c != '\n')
{
if (c == ' ')
printf ("\n");
else
printf ("%c", c);
n++;
}
printf ("\n");
if (n == MAXC) /* read and discard remaining chars in stdin */
while ((c = getchar ()) != '\n' && c != EOF);
return 0;
}
使用/输出强>
$ ./bin/getchar_print_nl_space
Enter a sentence.
input: This is a sentence to split into words.
This
is
a
sentence
to
split
into
words.
注意:如果您要存储所有字符,最多100个(表示99个字符和1个空终止符),则需要将长度检查调整为n < MAXC - 1
和然后null终止数组:
char s[MAXC] = {0};
/* read up to 99 characters from stdin into s */
while (n < MAXC - 1 && (c = getchar ()) != EOF && c != '\n')
s[n++] = c;
s[n] = '\0'; /* null-terminate after last character */
if (n == MAXC - 1) /* read and discard remaining chars in stdin */
while ((c = getchar ()) != '\n' && c != EOF);
然后,您将重复对空格进行逻辑检查并在newline
循环中打印for
:
for (c = 0; c < n; c++)
if (s[c] == ' ')
printf ("\n");
else
printf ("%c", s[c]);
了解输入方式,面向字符的输入和面向行的输入将节省您的时间,使您可以将正确的工具与情境相匹配。在这里,没有“更正确”或“更不正确”的方法,只是采用不同的方式。
答案 2 :(得分:0)
下面的代码是答案。 程序还计算空间/字符数和换行符。
http://cprograming-char-operation.blogspot.com/2018/07/for-given-statement-print-word-in-each.html
/* Program 1_12 */
/* Count number of line, space and char */
/* Replace a char with specific newline */
/* Add blank space in first input */
#include<stdio.h>
int main()
{
int c,nl,nc,ns,nt;
nl=nc=ns=nt=0;
int d,r, prevd, prevr;
printf("Enter which char to replace :: ");
/* prev is stored before of \n */
while((d = getchar()) != '\n' && (prevd = d));
d = prevd;
printf("Enter word below \n");
while((c=getchar()) != EOF)
{
++nc;
if(c==' ')
++ns;
if(c=='\n')
++nl;
if(c=='\t')
++nt;
/* Replace a char with A */
if(c==d)
putchar('\n');
else
putchar(c);
}
printf("total char=%2d, newline=%2d, space=%2d tabs=%2d\n",nc,nl,ns,nt);
return 0;
}
/* Written by: Prakash Katudia <prakash.katudia@gmail.com> */
输入要替换的字符:: :: #space#
在下面输入单词
你好 你好
如何
是
你
答案 3 :(得分:0)
我认为以更好的方式完成这项工作的另一种方法如下。
#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100
int main() {
char s[100],*c;
int i = 0;
scanf("%[^\n]", s);
//Write your logic to print the tokens of the sentence here.
for ( c = s; *c != (int)NULL; c++){
if ( *c == ' '){
*c = '\n';
}
}
printf("%s",s);
return 0;
}
答案 4 :(得分:0)
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i,len;
scanf("%[^\n]s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i] !=' ')
{
printf("%c", a[i]);
printf("\n");
}
}
}