2016-02-12 92 views
0

我正在编写一个程序,通过字母表将某个字符串的字母旋转一定的方向。它需要初始输入一个整数,我将其称为N,然后使用该整数作为每个字符在整个字母表中移动的字母数。一个正整数移到字母表的右侧,一个负整数向左移动。例如,如果输入的是:如何在使用scanf和'%d'时区分int和char

-2 cdefg 

输出将

abcde 

为了做到这一点,我需要为了得到初始ñ常规字母字符和整数之间的不同。我已经尝试使用scanf()与%d和isalpha()函数,以及%c和isdigit()函数,但两者似乎对我都有障碍。为了澄清,我只是在最初的变量N有问题。我不知道如何区分一个整数之间的'm'输入。据我了解,它将存储'm'的ASCII值为N

+0

要读取整数,请使用“%d”。要读取字符,请使用“%c”。您必须事先决定是否期望阅读其中一个或另一个。相同的字符串“2”可以被解析为一个整数或一个字符,但是结果会非常不同。 – dxiv

回答

1
  1. 阅读整行文本并将其存储在数组中。你可以使用fgets或 - 如果你有 - getline为此。
  2. 然后,您将该行上的第一个“单词”转换为使用strtol的数字。它会告诉你停止解析的位置end
  3. 只要将它解除引用到空白处(可以通过isspace查看),就可以将指针前进end
  4. 现在您处于需要旋转的第一个字符的位置。继续直到字符串的结尾。
1

你不需要区分它们。 N总是在字符串之前,所以只需使用适当的格式读取两者。

scanf("%d %s", &n, string); 

要判断用户是否输入了正确的输入,请检查scanf返回的值。它返回成功转换的项目数量。如果用户未首先键入整数,则转换将失败,因此它将返回0。如果用户在字符串前键入有效整数,它将返回2

+0

我试图区分** N **的不同类型的输入。如果用户输入'm'而不是整数,我不知道如何区分它与常规整数。如果我使用isdigit(),它将忽略大于9的所有数字以及全部对** N **有效的负数。 – moo

+0

这只会导致转换失败。检查'scanf'的返回值。如果不是2,则意味着用户没有输入正确的格式化输入。 – Barmar