1
#include <stdio.h>
#include <string.h>

/* Function prototypes */
void wordLength ( char *word );

int main (void)
{
    int choice;
    char word [20];

    printf( "Choose a function by enterting the corresponding number: \n"
        "1) Determine if words are identical\n"
        "2) Count number of words in sentence provided\n"
        "3) Enter two strings to be strung together\n"
        "4) Quit program\n" );
    scanf( "%d", &choice );
    flushall();

    while (choice >= 1 && choice < 4) 
    {
        /* if statements for appropriate user prompt and calls function */
        if (choice == 1) 
        {
            /* gather user input */
        printf( "\nYou have chosen to determine word length.\n"
                "Please enter the word:\t");
            gets( word );

            /* call function to output string as well as the string length */
            wordLength( word );

        }
    }
}

void wordLength( char *word )
{
    printf( "The string entered is:  %c\n", *word);
}

每当我输入一个单词时,我的程序只输出字符串的第一个字母。为什么这样做?我的字符串长度被声明为 20,所以我知道这不是问题!我似乎无法弄清楚。谢谢!

4

4 回答 4

6

因为你告诉它打印一个字符:

printf("The string entered is: %c\n", *word);

如果你想要字符串,请使用:

printf("The string entered is: %s\n", word);
于 2012-11-11T21:51:24.660 回答
2
void wordLength( char *word )
{
    printf( "The string entered is:  %c\n", *word);
}

在您的wordLength函数中,您将%c其用作格式说明符。 %c用于打印一个字符。用于%s打印字符串。

还要将 *word 更改为 word。*word 引用数组中的第一个或“zeroeth”值 - 单个字符。

不带星号的参数“word”引用整个数组,也可以表示为 &word[0]。这意味着它是第零个元素的地址。

总结一下...... %s 需要一个数组的地址,& 指定地址,[0] 指定第零个元素。没有 & 和相应的数组括号 [] 的变量是等效的。所以“&word[0]”和“word”是一样的。在您需要指定不是第 0 个元素(例如 &word[10])的元素的地址之前,这似乎毫无意义。例如,如果您的字符串是“Sit on a potato pan Otis”,并且您想从字符串中提取单词“Otis”。

%c 需要单个字符,星号“取消引用”指针,因此 *word 引用实际字符,而不是字符的地址。

为了形象化它,想象一个药盒,也许是你祖父用来做药的那种。碉堡代表一个字符数组。有 7 个小隔间,每个隔间都标有从星期日开始到星期六结束的一周中的每一天。所以你的数组从 0 到 6。第一个隔间是字符串的开头。星期日是字符数组的第零个元素的地址。

当您打开周日隔间时,您会看到里面的药丸 - 这就是“价值”。星期日将表示为 &word[0],星期一将表示为 &word[1]。如果您想要周日隔间内的值(药丸),则指定 *word。如果您希望将整个数组作为字符串(以提供 %s 格式说明符),那么您可以指定 &word[0] 或只是简单的“word”,因为它们是等价的。如果要打印从第二个字符开始的字符串,则应指定 &word[1]。想要周一隔间内的价值吗?使用 *(word+1) 并且对于字符使用 %c 来打印它。我希望我已经为你澄清了一些事情。

于 2012-11-11T21:51:56.657 回答
2

您正在使用 %c 作为修饰符,它只打印字符。您应该使用 %s。查看println 修饰符

于 2012-11-11T21:53:05.477 回答
0

如果必须使用它,您可以逐个字符地打印,方法是:

for( i = 0; i < 20; i++ ){
    printf( "%c", *( word + i ) );

    /* If you reach the end of the string, print a new line and stop. */
    if( *( word + i ) == '\0' ){
       printf( "\n" );
       break;
    }
}
于 2012-11-11T22:20:22.667 回答