我正在编写一个C程序,该程序解析字符串并通过将字符串字符分解为由空格分隔的单词来对其进行标记。我的问题是当我运行我当前的程序时:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[20];
printf("Please enter your word:\n");
scanf("%c", &input);
printf("%c", input[1]);
return 0;
}
如果我要输入“This”这个词,我希望在我运行该程序时返回“h”,而是我得到一个向下指向的箭头。但是,当输入设置为打印输出[0]时,我返回“T”。
编辑:我修改了我的代码,以便打印出现在我将在下面显示的整个字符串
int main()
{
char input[20];
printf("Please enter your words:\n");
scanf("%s", input);
printf("%s", input);
return 0;
}
我的目标是能够将该字符串分解为字符,我可以搜索以查找空格,从而能够隔离这些字,例如,如果我的输入是“这是坏的”我想要代码到打印 此
是
坏
编辑: 我修改了我的代码以适应其中一个答案,但我遇到的问题是它不会编译
int main()
{
char input[20];
printf("Please enter your words:\n");
size_t offset = 0;
do
{
scanf("%c", input + offset);
offset++;
}
while(offset < sizeof(input) && input[offset - 1] != '\n');
}
printf("%c", input[]);
return 0;
答案 0 :(得分:3)
问题:
1)scanf("%c", input);
仅设置数组的第一个元素input
。
2)printf("%c", input[1]);
打印数组input
的第二个元素,其中包含未初始化的数据。
解决方案:
小型机器。对字符串大小没有限制,如20。
#include <ctype.h>
#include <stdio.h>
int main() {
int ch = fgetc(stdin);
while (ch != EOF) {
while (isspace(ch)) {
// If only 1 line of input allowed, then add
if (ch == '\n') return 0;;
ch = fgetc(stdin);
}
if (ch != EOF) {
do {
fputc(ch, stdout);
ch = fgetc(stdin);
} while (ch != EOF && !isspace(ch));
fputc('\n', stdout);
}
}
return 0;
}
答案 1 :(得分:3)
scanf("%c", &input);
没有按照您的想法行事。
首先,%c
仅扫描一个字符:http://www.cplusplus.com/reference/cstdio/scanf/
其次,数组的名称已经是指向它的第一个元素的指针,所以说明&input
你指向一个指针,所以不是将你的字符存储在数组的第一个元素中,而是将它存储在指向数组的指针中。是一件非常糟糕的事情。
如果你真的想使用scanf,我推荐一个循环:
size_t offset = 0;
do
{
scanf("%c", input + offset);
offset++;
}
while(offset < sizeof(input) && input[offset - 1] != '\n');
如果单词长度超过20个字符http://en.wikipedia.org/wiki/Buffer_overflow
,则使用scanf("%s", input")
会使您容易受到缓冲区溢出攻击
在我的例子中,我假设你想用换行符完成你的单词。
编辑:在scanf文档中也是一个很好的例子:
scanf("%19s", input);
扫描不超过19个字符,这也可以防止缓冲区溢出。但是如果要更改输入大小,则必须将其更改为两个位置。
答案 2 :(得分:2)
您可以使用
char * strtok ( char * str, const char * delimiters );
标记你的字符串。如果您在input []数组中输入并想要标记符合空格字符的字符串,则可以执行以下操作:
char *ptr;
ptr = strtok(input, " ");
while(ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
只有第一次调用strtok()才需要将字符数组作为输入。在下一次调用中指定NULL意味着它将在相同的字符数组上运行。
答案 3 :(得分:0)
您的scanf
只会获取第一个字符,input[1]
包含随机垃圾。请改用scanf("%19s", input)
。