C语言 - 单词数组

4

我是一名编程新手,如果这个问题看起来很琐碎,请原谅。我已经寻找了答案,但是我无法得到一个明确的答案。我们在课堂上讨论过这个问题,但是我的大脑现在完全失灵了。

在C语言中,我需要创建一个数组,使每个元素对应一个单词。

编辑:我刚想起来应该使用指针数组做些什么。所以我正在做类似于这样的事情...

main()
{
    char *line[MAXLINE];   // This points to the beginning of words in compare[]
    char compare[MAXLINE]; // This is where the words will be read in
    int  counter[MAXLINE]; // Counter for the words that appear more than once
    char c;
    int i = 0;
    int n;

    for (n=0; c!=EOF; n++){
        while ((c=getchar())!=' '||c!='\n'||c!=EOF){
            compare[i]=c;
            i++;
        }
        line[n]=compare;
        i = 0;
    }

我知道这并不是全部,因为我需要让“compare”有一个新地址,有什么建议吗?我需要使用struct还是有其他方法?我应该使用malloc吗?

如果我问了一个愚蠢的问题,请原谅。由于这是我的第一篇帖子,我对提问的方式有任何意见都非常感激,因为我已经非常尊重这个社区,并不想因为愚蠢的问题而破坏它。同时,关于问题本身的反馈也是受欢迎的:)

谢谢, Slashstar


如果这是作业,你应该编辑标签以说明。 - zdav
2个回答

1

使用 scanfdo..while 循环:

int counter = 0, i;
int length = 15;
char *wordz[length];

do {
    printf("Enter word number %d:", counter+1);
    char *temp = (char *) malloc(sizeof(char*));
    scanf("%s", temp);
    if(temp) {
        wordz[counter++] = temp;
    }       
} while(counter < length);

for(i = 0; i < length; i++) {
    printf("\nWord number %d is %s", i+1, wordz[i]);
    free(wordz[i]); //we malloc'd in the do statement above, so we must free the memory...
}

声明一下,这个解决方案是可行的。

截图:(在这种情况下将长度变量设置为5)


alt text


我对scanf不是很熟悉。你能解释一下你写的那段代码如何工作吗? - user527179
你没有为wordz分配任何内存,只是为指针分配了空间。 - Steve Rowe
@user527179 这怎么可能?你在使用指针,却不熟悉scanf函数...只是好奇。 - MSI
嗯,我们的课程正在学习 K&R C 编程语言,那是第7章内容。指针则在第5章。 - user527179
1
@Jacob:temp 的大小为 1,而你正在将一个单词读入其中。 - codaddict
显示剩余4条评论

1

类似这样的代码应该可以在Linux上运行,但如果在Windows上运行,你需要同时删除末尾的\r。

char buf[MAXLINE];
char** wordsz = malloc( MAXNUMBEROFWORDS * sizeof(char*) );
int wordCount = 0;
while (fgets( buf, MAXLINE, stdin )!=NULL && wordCount<MAXNUMBEROFWORDS)
{
   int len = strlen(buf); 
   if ( buf[len-1] == '\n' ) buf[len-1]='\0';
   wordsz[wordCount] = malloc( strlen(buf) + 1 );// assuming sizeof(char)==1 + \0
   strcpy(wordsz[wordCount++], buf);
} 

fgets在EOF的时候会返回NULL,如果使用scanf输入过长的字符串可能会导致内存覆盖,而且你只分配了实际需要的空间(除了MAXNUMBEROFWORDS)


这看起来非常干净!感谢提供另一种方法!不知道为什么有人会给你点踩 :( - user527179

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接