我目前难以从stdin
逐行读取由空格分隔的单词。我试图逐行读取单词,只是打印它们,从访问字符串数组。
如果我想读这句话:
Enter words:
Hi there, how was your day sir?
然后我只想打印下面的句子,如下:
Your sentence:
Hi there, how was your day sir?
这是我的代码到目前为止:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int
main(int argc, char *argv[]) {
char *word = NULL;
char **words = NULL;
int word_size = 1, word_len = 0, word_count = 0;
int words_size = 1, i, ch;
word = (char*)malloc(word_size *sizeof(char));
words = (char **) malloc(words_size*sizeof(char*));
printf("Enter words:\n");
while ((ch = getchar()) != EOF) {
if (isalpha(ch)) {
word_size++;
word = realloc(word, word_size+1);
word[word_len++] = ch;
word[word_len] = '\0';
}
if (isspace(ch)) {
words_size++;
words = realloc(words, words_size+1);
words[word_count] = malloc(strlen(word)+1);
words[word_count++] = word;
word_len = 0;
word_size = 1;
}
if (ch == '\n') {
printf("Your sentence is:\n");
for (i = 0; i < word_count; i++) {
printf("%s ", words[i]);
}
printf("\n");
word_len = 0;
word_size = 1;
words_size = 1;
}
}
return 0;
}
我只是不确定为什么这不起作用,以及为什么打印最后一个字。我知道有很多mallocing和reallocing,我只是想更好地使用它们。
任何帮助将不胜感激
答案 0 :(得分:1)
你没有将这个词分配给你的char **。
使用
words[word_count++] = word;
您要将本地变量字的地址分配给指针words[word_count]
在计算结束时,这会将所有带有最后存储的单词的单词转换为word
c-string。
使用
为单词c-string准备空格words[word_count] = malloc(strlen(word)+1);
所以你需要做的是将单词c-string的内容复制到分配空间
strcpy(words[word_count++], word);
否则,您正在泄漏为该单词分配的内存。
附注:
malloc
和realloc
可能会失败,因此请检查其返回值!= NULL
free
malloc
内存。在&#34; hi-level&#34; OS内存在执行结束时自动释放,但未在所有平台/ OS上授予修改强>
另一个问题是你要为你的char重新分配错误的大小** 你应该使用
words_size++;
words = realloc(words, sizeof(*words)*words_size);
对于要存储的新词数,这是char *
的大小
你也可以避免使用strlen
,你有word_len
变量存储的单词长度
words[word_count] = malloc(word_len+1);
最后,在存储新单词之前,您应该检查至少找到了alpha char。这样可以避免测试sting的第一个空格char的输出:
if ((isspace(ch)) && (word_size>1))