编写一个程序,提示用户输入字符串并打印字符串的优点。通常,字符串的优点是通过以下方式计算:如果字符串包含除0或1之外的任何字母,则其优度为0.否则,其优点是字符串中的1的数量。
int numZeros, numOnes, i;
char sent[50];
i = 0;
printf("Enter a string with no spaces: ");
scanf(" %s", sent);
for(i=0; i != '\0'; ++i){
if(sent[i] == '0'){
++numZeros;
}
else if(sent[i] != '\0'){
++numOnes;
}
}
if((numOnes == 0) && (numZeros == 0)){
printf("\nGoodness of the input is 0\n");
}
else if((numZeros > 0) && (numOnes == 0)){
printf("\nGoodness of the input is 0\n");
}
else{
printf("\nGoodness of the input is %d\n", numOnes);
}
return 0;
有人可以解释为什么在最后的其他声明中,当我打电话并试图显示变量" numOnes"即使我在一个句子中输入了特定数量的1,我也会得到一些数字?
答案 0 :(得分:2)
else if( sent[i]!='0')
...
初始化numOnes
numZeros
。
for循环将为for(i=0;sent[i]!='\0';i++)
您还可以简化打印逻辑。计算输入的长度。
if(numZeroes+numOnes < len )
// Goodness is zero
else
// Goodness is numOnes
实现:
int main()
{
int numZeros=0, numOnes=0;
char sent[50];
printf("Enter a string with no spaces: ");
scanf(" %s", sent);
for(int i=0; sent[i]; ++i)
(sent[i]=='0')?numZeros++:numOnes++;
printf("Goodness of the input is %d", (numOnes+numZeros<strlen(sent))?0:numOnes);
return 0;
}
答案 1 :(得分:0)
试试这个:
int main(){
int numZeros = 0, numOnes = 0, i;
bool ver = true;
char sent[50];
i = 0;
printf("Enter a string with no spaces: ");
scanf(" %s", sent);
for(i=0; sent[i] != '\0'; ++i){
if(sent[i] == '0')
++numZeros;
else if(sent[i] == '1')
++numOnes;
else{
ver = false;
break;
}
}
if(ver){
if((numOnes == 0) && (numZeros == 0))
printf("\nGoodness of the input is 0\n");
else if((numZeros > 0) && (numOnes == 0))
printf("\nGoodness of the input is 0\n");
else
printf("\nGoodness of the input is %d\n", numOnes);
}else{
printf("\nGoodness of the input is 0\n");
}
return 0;
}
您不需要任何额外的库。
答案 2 :(得分:0)
我们可以递归地定义一个名为“几乎是好”的属性,并编写一个递归解决方案。 C字符串非常好地支持递归,因为如果s
是非空C字符串,那么s + 1
(高一个字节的地址)也是一个C字符串,表示在{的第一个字符之后保留的后缀{1}}。
s
几乎善良的定义如下:
如果字符串为空,则其几乎为零。
如果字符串的第一个字符不是/* almost_goodness returns -1 if the string contains
bad characters, otherwise the count of 1's. */
static int almost_goodness(const char *str)
{
switch (*str) {
case 0: /* null terminator: empty string */
return 0;
case '0':
case '1':
{
int ag_rest = almost_goodness(str + 1);
return ag_rest < 0 ? ag_rest : (*str == '1') + ag_rest;
}
default:
return -1;
}
}
int goodness(const char *str)
{
int ag = almost_goodness(str);
return ag < 0 ? 0 : ag;
}
或1
,那么它的好处就是-1。
如果字符串其余部分的差不多是-1,则几乎是-1。
否则,如果第一个字符是0
,那么差不多的好处是1加上其余字符串几乎是好的。
否则,第一个字符必须是1
,并且差不多是字符串其余部分的优点。
通过将-1视为0来获得良好性。
这是更好的东西:尾递归0
,通过显式累加器。这不允许编译器将其优化为循环,这意味着它不需要与传入字符串的长度成比例的堆栈空间量。作为奖励,代码更清晰,这通常与重写递归累加器的递归相反:
goodness
这里“(几乎 - )善良累加器”参数static int almost_goodness(const char *str, int goodness_acc)
{
if (goodness_acc < 0)
return goodness_acc;
switch (*str) {
case 0:
return goodness_acc;
case '1':
return almost_goodness(str + 1, 1 + goodness_acc);
case '0':
return almost_goodness(str + 1, goodness_acc);
default:
return -1;
}
}
int goodness(const char *str)
{
int ag = almost_goodness(str, 0);
return ag < 0 ? 0 : ag;
}
表示“我们目前所知道的关于我们之前已经看过的字符串的某些早期部分的好处”。如果此值为-1,则我们不必费心处理我们给出的字符串部分。
最后,这是一个纯粹的迭代goodness_ac
函数:
goodness
非常简单:遍历字符串,为每个int goodness(const char *str)
{
int g = 0;
for (; *str; str++) {
switch (*str) {
case '0':
break;
case '1':
g++;
break;
default:
return 0;
}
}
return g;
}
递增一个计数器,并跳过每个1
。如果我们看到任何其他字符,无论计数器的值如何,我们都会立即保留零。