【问题标题】:Scanning a integer from a character array从字符数组中扫描整数
【发布时间】:2019-02-09 21:11:27
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {

    int a[10];
    for (int i=0 ; i<10;i++){
        a[i]=0;
    }

    char *str = (char *)malloc(1024*sizeof(char));
    scanf("%s",str);
    str = realloc(str, strlen(str)+1);

    for (int i = 0;i<strlen(str);i++){

        for ( int j = 0;j<=9;j++){
            if(*str=='j') a[j]++;
        }

        str++;
    }
    for (int i=0 ; i<10;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

if(*str=='j') a[j]++; 期间的这段代码中,条件*str == j 始终返回false,因此a[j] 的值根本没有改变。

为什么会发生这种情况,我可以做些什么来解决这个问题?

代码应该扫描给定数组中的整数并给出数字出现的频率。

示例输入:a11472o5t6

输出:0 2 1 0 1 1 1 1 0 0

【问题讨论】:

  • 请修正您的代码。它在那里有一些意外的插入。同时更正缩进。
  • str = realloc(str, strlen(str)+1); 这里的目的是什么?这很没有意义。
  • 程序应该做什么?请显示输入和预期输出的示例。
  • 为什么条件仍然成立?你的输入是什么?仅当输入以 'j' 开头时才会如此
  • @EugeneSh。输入可以是任何字符或任何数字。如果在任何 j(比如 j=5)*str 等于 j(在这种情况下为 5),我打算更新 a[j](或 a[5])。

标签: c arrays


【解决方案1】:
  • str = realloc(str, strlen(str)+1); 步骤毫无意义。你可以删除这一行。
  • j 比较是没有意义的。由于您在计算数字,因此应该改为 '0' + j
  • 我建议使用str[i],而不是推进strstr++。这样,您仍然可以保留原来的 str 指针,以防您想将其传递给 printfstrlen 等。

对于内部循环,试试这个:

for ( int j = 0; j <= 9; j++ )
{
    if(str[i] == ('0' + j)) a[j]++;
}

【讨论】:

  • strstr++.. 推进,但这会混淆 strlen() 测试,所以是的。有问题
  • 呃,你为什么要这样做而不是我在答案中所做的?
  • 我只是在评论你的评论“你从不推进 str”,这是不准确的。
  • “你永远不会推进 str”是一个准确的陈述。 str 在 OP 的代码中从来没有高级过。但我没有推进它,而是建议访问 char 以与 str[i] 进行比较。
  • 哎呀完全错过了,你是对的。不过我还是更喜欢str[i]
【解决方案2】:

我想也许你想要的是if(*str=='0'+j) a[j]++;

换句话说,如果 j 为零,则检查“0”字符;如果 j 为 1,则检查 '1',以此类推

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2015-01-27
    相关资源
    最近更新 更多