使用scanf在C中向后打印字符串

时间:2011-09-13 22:34:23

标签: c string scanf

我正在尝试在c中向后打印我的字符串,我似乎无法使用空格。我知道如果在scanf函数中最后一个返回的字符后面有任何空格,它将终止,因为没有剩余的字符可以从输入的字符串中扫描。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLETTERS 20

void readStringBackwards();

main()
{
readStringBackwards();
}


void readStringBackwards()
{



printf("Please enter a string of up to 20 characters in length:\n ");
char str[20];
scanf("%s", str);
int i;
int stringlength = strlen(str);

if (stringlength > MAXLETTERS)
{
    printf("The string length is too long!");
}
else
{
    for( i = stringlength-1; i >= 0; i--){

        printf("%c ", str[i]);

    }

}



}

本质上该程序最多可接受20个字符,并向后打印字符串。我一直在搜索有关scanf及其工作原理的信息,但很难找到直接的答案。任何提示都表示赞赏。现在,我将得到的是我反向键入的第一个单词。空格后的其他字符将被跳过,并且不会存储在数组中。

3 个答案:

答案 0 :(得分:3)

为什么不使用fgets()代替scanf()

char str[21]; // Note 21, not 20 (remember the null terminator)
fgets(stdin, 21, str);

请注意,如果字符串少于20个字符,则会包含换行符,因此您需要将其删除(使用'\0'覆盖就可以了。)

答案 1 :(得分:3)

scanf("%s", str);将读取空格,即使它超过20个字符。空白,换行符和制表符被视为空格字符。

考虑使用类似"%20[^\n]"的格式规范,只要它们不是'\n',就应该读取最多20个字符。

编辑正如Oli Charlesworth指出的那样,缓冲区必须至少长度为21而不是20。

答案 2 :(得分:-1)

此代码运行正常但尝试使用gets()代替scanf()来读取字符串中的空格!