-1

我有一个简单的问题:让用户从键盘输入一些单词,每行一个单词,直到出现“。” (句号)输入然后打印出结果,例如:

Enter a word: word1
Enter a word: word2
Enter a word: .
You have entered 2 word(s):
word1
word2

好的,我试试,但是当我运行它时说文件在让我输入第一个单词后停止工作

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () 
{ 
    char *word[50]; //each word has maximum 49 character
    int i=0, number_of_word;

    do
    {
        printf ("Enter a word: ");
        scanf("%s", &word[i]);
        i++;
    }
    while (word[i][0]!='.');

    number_of_word =i;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++)
    {
        printf("%s\n", &word[i]);
    }

    return 0;
}

-------------------------------------------------- ---------------------

编辑1:

好的,我试试这个,它有效,但我仍在寻找最好的方法来声明一个未知大小的字符串数组,因为我不知道用户可以输入多少个单词,也不知道每个单词有多少个字母,在 C++ 中它可能调用动态分配数组,我不知道如何在 C 中做到这一点

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () 
{ 
    char word[20][50]; //array has maximum 20 words, each word maximum 50 character
    int i=0, number_of_word;

    do
    {

        printf ("Enter a word: ");
        scanf("%s", word[i]);
        i++;
    }
    while (word[i-1][0]!='.');

    number_of_word =i-1;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++)
    {
       printf("Word %d is %s\n", i, word[i]);
    }


    return 0;
}
4

8 回答 8

5

您没有分配任何内存来存储各个字符串,因此您的程序会调用undefined behavior

这个:

char *word[50];

定义了一个包含 50 个指针的数组,但没有进一步的存储。

当你这样做时:

scanf("%s", &word[i]);

您正在写入指针数组。

于 2012-04-29T19:54:54.680 回答
1
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int main () {
    char *word[50]; //each word has maximum 50 word
    char enter_word[50];//maximum 49 character
    int i=0, number_of_word;

    while(1){
        printf("Enter a word: ");
        scanf("%49s", enter_word);
        if(*enter_word == '.')break;
        word[i++]=strdup(enter_word);
    }

    number_of_word = i;
    printf ("You entered %d word(s):\n", number_of_word);
    for (i=0; i<number_of_word; i++){
        printf("%s\n", word[i]);
    }

    for(i=0;i<number_of_word; ++i)
        free(word[i]);

    return 0;
}
于 2012-04-29T22:43:20.590 回答
0

您只需尝试在 scanf() 中使用“%s”的“%[^\n]”位置。

因为 "%s" 存储字符,直到它在字符串中找到第一个空格。

用你第一次问的程序试试这个

愿它对你有所帮助。

于 2012-04-30T11:52:21.553 回答
0

"char *word[50]" 没有为单个字符串分配内存。你应该使用 alloc 的函数来分配它

于 2012-04-30T11:35:47.977 回答
0

当你声明

char *word[50];

您有 50 个指向随机内存的 char 指针。你想要的是这样的:

char word[50][50];

请注意,您只能有 49 个单词(以及 '.'),并且每个单词可以少于 50 个字符(不要忘记 \0,所以 50 个字符的单词会溢出)。

你会想要将你的 scanf 调用更改为:

scanf("%s", word[i]);

请注意,您不需要 &,因为 word[i] 已经是一个指针。

于 2012-04-29T19:57:01.627 回答
0
char *word[50];

您有一个包含 50 个指针的数组。您需要一个 50 字节块的数组。你想读多少字?如果您知道最大值,您可以提前分配空间。如果你不这样做,你需要一个字符串链表之类的东西,当你阅读它时,你可以在其中附加一个新项目。

于 2012-04-29T19:57:15.673 回答
0

它是您的 printf 呼叫。请记住将结束字符 \0 添加到单词的末尾。Printf 打印字符串时打印 char 数组中的所有内容,直到它读取结束字符 \0

BasicAlly ... Hos 应该知道这个词有多长,什么时候应该停止打印?(现在它会永远持续下去)

于 2012-04-29T19:58:31.570 回答
0

您没有为各个字符串分配内存。

Char *word[50] 只是声明了一个指向一个char 指针数组的指针。

编辑

我将在这里尝试用一些伪代码来说明这一点......手机上的格式化代码几乎是不可能的:) 鉴于先前的 char * 输入 [50]:

char * nextString;

bool entering=true;

do{

nextString =calloc(50);

// enter the string to nextString

if (nextString[0] != '.'){

     input[i] = nextString;

     i++;

 } else{

 entering=false;

}
}
}while(entering)
于 2012-04-29T20:00:42.273 回答