【问题标题】:Printing a string backwards in C with scanf使用scanf在C中向后打印字符串
【发布时间】:2011-11-16 14:03:20
【问题描述】:

我试图在 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 及其工作原理的信息,但很难找到直接的答案。任何提示表示赞赏。现在我得到的只是我反向输入的第一个单词。空格后面的其他字符被跳过,不存储在数组中。

【问题讨论】:

  • 如果用户输入 > MAXLETTERS 那么你只是有一个缓冲区溢出。你不能可靠地调用 strlen 来确定他们是否这样做,已经太晚了。

标签: c string scanf


【解决方案1】:

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

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

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

【讨论】:

  • @Oli:也许吧,但他仍然说他想在空格之后阅读。
  • 这非常适合我想要它做的事情。谢谢!我不知道所有的格式规范,有参考资料可以学习吗?
  • @TMGunter:另请注意,您的缓冲区必须长度为 21,而不是 20。
  • 是的,谷歌搜索“printf 格式规范”。请注意,我的格式说明符不会读取尾随的 '\n',这可能会给后续读取带来麻烦。最后再添加\n,这样换行符就被消耗掉了。
【解决方案2】:

为什么不用fgets() 而不是scanf()

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

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

【讨论】:

  • 我试图不使用“gets”。我一直在网上阅读,似乎每个人都说不要使用它。他们为什么这么说呢?
  • @TMGunter:fgetsgets 不同。他们告诉你不要使用gets,因为它无法指定接收缓冲区的长度。因此,如果用户输入的字符超过 20 个,它将覆盖您堆栈中的某些内容。
  • @TMGunter 那不是关于getsgets 是一个不好的函数,因为它不限制输入的字符数。它将用作gets(str);,您可能会遇到缓冲区溢出。 fgets 函数,另一方面,是一个不错的好函数:D(第二个参数告诉要读取的最大字符数)
【解决方案3】:

此代码运行良好,但请尝试使用gets() 而不是scanf() 来读取字符串中的空格!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2020-06-24
    • 2014-02-17
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多