问题是在字符串之间找到空格。如果检测到空格,则应在下一行打印下一个单词。 例如" 这是C " 它将打印为: 此\ n 为\ n C
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[20];
int a,i;
scanf("%[^\n]", str);
a=strlen(str);
for(i=0;i<a;i++)
{
printf("%s",str[i]);
if(str[i]==0)
{
printf("\n");
}
}
return 0;
}
如何使此代码生效?
答案 0 :(得分:3)
使用isspace()
功能。另外,请不要忘记C字符串由'\0'
终止。
请查看the man page了解更多详情。
答案 1 :(得分:3)
在你的程序中,制作
printf("%s",str[i]);
到
printf("%c",str[i]);
因为str[i]
字符不是字符串,字符的格式说明符是%c
。 %s
表示字符串。
并改变
if(str[i]==0)
{
printf("\n");
}
到
if(str[i]==' ')
{
printf("\n");
}
每次检测到空格时都要打印换行符。
使用scanf()
的宽度说明符,如
scanf("%19[^\n]", str);
其中19
是str
字符数组的大小。
您可能还想检查scanf()
的返回值,这是它完成的成功分配的数量。在这种情况下,它应该是1
。
此外,请使用string.h
标头文件以使用strlen()
,并且不需要包含stdlib.h
。
正如评论部分所述,strlen()
会返回size_t
而不是int
,尽管基本上size_t
是无符号整数。
请参阅What is size_t
in C和this。
char *ptr;
if( fgets(str, sizeof(str), stdin) )
{
for(char *ptr=strtok(str, " "); ptr!=NULL; ptr=strtok(NULL, " "))
{
printf("\n%s", ptr);
}
}
strtok()
使用第二个参数中的字符作为分隔符来标记str
。
请注意,fgets()
也会在尾随\n
中读取。如果您需要将其删除,请执行
str[strlen(str)-1]='\0';
如果最后一个字符是\n
。
答案 2 :(得分:2)
以下提议的代码:
现在,建议的代码:
#include <stdio.h>
int main( void )
{
int ch;
while( ( ch = getchar() ) != '\n' && EOF != ch )
{
if( ' ' == ch )
{
puts( "" );
}
putc( ch, stdout );
}
puts( "" );
return 0;
}
答案 3 :(得分:0)
您的程序在这里有未定义的行为
printf("%s",str[i]);
因为str[i]
的类型为char
,并且您使用%s
格式说明符打印它,该格式说明符用于printf null终止的字符数组。
来自C标准#7.21.6.1p9
如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义。 [强调我的]
另外,请避免使用scanf()
进行字符串输入。如果不小心使用,可能会出现缓冲区溢出问题。您应该使用fgets
代替。
来到你的问题:
The question is to find spaces between the string. And if spaces are detected the next word should be printed in the next line.
正如我在评论中建议的那样,您可以使用strtok()
来做空格作为分隔符。 strtok()
会将输入字符串拆分为标记。关于strtok()
的注意事项是它通过分解为较小的字符串(标记)来修改输入字符串。如果你没事,那么你可以这样做:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF_SZ 20
int main() {
char str[BUF_SZ];
char *pch;
if (fgets (str, BUF_SZ, stdin) == NULL) {
perror ("fgets failed");
exit (EXIT_FAILURE);
}
str[strcspn (str, "\n")] = 0;
pch = strtok (str," ");
while (pch != NULL) {
printf ("%s\n", pch);
pch = strtok (NULL, " ");
}
return EXIT_SUCCESS;
}
while
循环后,str
的内容与调用strtok()
之前的内容不同。但是,是否修改原始输入字符串在这里没有意义,因为在将其分解为令牌之后,它不会被更多地使用。
你的问题是 - if spaces are detected the next word should be printed in the next line..
。如果只是打印新行中的单词,您可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SZ 20
int main() {
char str[BUF_SZ];
int word_size = 0;
int i = 0, start = 0;
if (fgets (str, BUF_SZ, stdin) == NULL) {
perror ("fgets failed");
exit (EXIT_FAILURE);
}
str[strcspn(str, "\n")] = 0;
for (i = 0; str[i] != '\0'; i++) {
start = i;
if (str[i] != ' ') {
word_size++;
if (str[i+1] != '\0')
continue;
start++;
}
if (word_size != 0) {
printf ("%.*s\n", word_size, str + start - word_size);
word_size = 0;
}
}
return EXIT_SUCCESS;
}
此解决方案不会修改输入字符串,只是解析它,如果检测到空格,则在新行中打印下一个字。