为什么这只输出我输入的字符串的第一个字母?

时间:2012-11-11 21:49:00

标签: c

#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 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

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

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

同时更改*单词到单词。 * word引用数组中的第一个或“zeroeth”值 - 单个字符。

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

总结...... %s需要一个数组的地址,&amp;指定地址,[0]指定零点元素。一个没有&amp;的变量。和相应的数组括号[]是等价的。所以“&amp; word [0]”与“word”相同。在您需要指定不是零元素的元素的地址(例如&amp; word [10])之前,这似乎毫无意义。例如,如果你的字符串是“坐在土豆锅上的奥蒂斯”,你想从字符串中拔出“奥的斯”一词。

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

为了想象它,想象一个药盒,也许是你的祖父用于他的药物。药丸代表一系列字符。有7个小隔间,每个隔间标注一周中的每一天,从星期日开始到星期六结束。所以你的数组从0到6。第一个隔层是字符串的开头。星期日是字符数组的零元素的地址。

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

答案 2 :(得分:2)

您使用%c作为修饰符,仅打印字符。你应该使用%s。查看println modifiers

答案 3 :(得分: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;
    }
}