字符串数组问题

时间:2016-10-10 13:17:41

标签: c

我目前难以从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,我只是想更好地使用它们。

任何帮助将不胜感激

1 个答案:

答案 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);

否则,您正在泄漏为该单词分配的内存。

附注:

  1. mallocrealloc可能会失败,因此请检查其返回值!= NULL
  2. 您必须free malloc内存。在&#34; hi-level&#34; OS内存在执行结束时自动释放,但未在所有平台/ OS上授予
  3. 修改

    另一个问题是你要为你的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))