使用C计算并从字符串中获取整数

时间:2017-08-02 00:13:08

标签: c string

我自学C编程。 我试图计算给定字符串中以空格分隔的int数。

EXP: 输入str =" 1 2 11 84384 0 212" 输出应为:1,2,11,84384,0,212 总计int = 6

当我尝试。它给了我所有数字作为输出有意义,因为我没有在这里使用正确的方法。

我知道在python中我可以使用str.split("")函数来完成我的工作。

但是我想在C中尝试类似的东西。尝试创建我自己的分割方法。

<dom-module id="landing-app">
  <template>
    <button on-click="_handlerCall">Change to Dashboard</button>
  </template>
  <script>
    class LandingApp extends Polymer.Element {

      static get is() {return 'landing-app'}

      _handlerCall() {
        this.set('route.path', '/dashboard') // but no luck :(
      }
    }
    customElements.define(LandingApp.is, LandingApp);
  </script>
</dom-module>

我知道这不是解决这个问题的正确方法。一种跟踪prev的方法,并使用遇到的非空格数字来动态创建内存。 但我不确定这种方法是否有帮助。

6 个答案:

答案 0 :(得分:2)

你想逐步建立你的数字,直到你找到一个空格,然后把它放到数组中。您可以通过乘以10然后每次添加下一个数字来完成此操作。

void count_get_ints(const char *data) {
    int buf[10000];
    int j = 0;
    int current_number = 0;

    // Move this outside the loop to eliminate recalculating the length each time
    int total_length = strlen(data); 
    for (int i=0; i <= total_length; i++) {
        // Go up to 1 character past the length so you 
        //   capture the last number as well
        if (i == total_length || isspace(data[i])) {
            // Save the number, and reset it
            buf[j++] = current_number;
            current_number = 0;
        }
        else {
            current_number *= 10;
            current_number += data[i] - '0';
        }
    }
}

答案 1 :(得分:2)

我认为strtok将提供更清晰的解决方案,除非您真的想要迭代字符串中的每个字符。我做了C已经有一段时间了,所以请原谅下面代码中的任何错误,希望它会给你正确的想法。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[19] = "1 2 11 84384 0 212";
    const char s[2] = " ";
    char *token;
    int total;

    total = 0;
    token = strtok(str, s);

    while (token != NULL) {
        printf("%s\n", token);
        total += atoi(token);
        token = strtok(NULL, s);
    }
    printf("%d\n", total);

    return 0;
}

答案 2 :(得分:0)

您可以通过执行c-'0'来检查每个字符的ascii值。如果它在[0,9]之间,那么它就是一个整数。通过具有状态变量,当您通过检查给定字符是否是空格数而在整数内部时,可以通过忽略空格来跟踪计数。另外,您不需要缓冲区,如果数据大于10,000会发生什么,并且您写入了缓冲区的末尾 ?,将会发生未定义的行为。该解决方案不需要缓冲区。

编辑,解决方案现在打印字符串

中的整数
void count_get_ints(const char *data) {
   int count = 0;
   int state = 0;
   int start = 0;
   int end = 0;
   for(int i = 0; i<strlen(data); i++){
      int ascii = data[i]-'0';
      if(ascii >= 0 && ascii <= 9){
         if(state == 0){
            start = i;
         }
         state = 1;
      }else{
         //Detected a whitespace
         if(state == 1){
            count++;
            state = 0;
            end = i;
            //Print the integer from the start to end spot in data
            for(int j = start; j<end; j++){
                printf("%c",data[j]);
            }
            printf(" ");
         }
      }
   }
   //Check end
   if(state == 1){
      count++;
      for(int j = start; j<strlen(data); j++){
          printf("%c",data[j]);
      }
      printf(" ");
   }
   printf("Number of integers %d\n",count);
}

答案 3 :(得分:0)

我认为执行此操作的标准方法是使用sscanf格式说明符来%n来跟踪读取的字符串数量。

您可以从大型数组开始阅读 -

int array[100];

然后你可以继续读取字符串中的整数,直到你不能阅读或者你已经读完了100。

int total = 0;
int cont = 0;
int ret = 1;
while(ret == 1 && total < 100) {
    ret = sscanf(input, "%d%n", &array[total++], &cont);
    input += cont;
}
total--;
printf("Total read = %d\n", total);

array包含所有读取的数字。

以下是DEMO

答案 4 :(得分:0)

使用Str()

的示例
strtol

答案 5 :(得分:-1)

假设你的字符串中没有任何非数字,你可以只计算空格数+ 1来查找字符串中的整数数,就像这个伪代码一样:

for(i = 0; i < length of string; i++) {
   if (string x[i] == " ") {
      Add y to the list of strings
      string y = "";
      counter++;
   }

   string y += string x[i]
}

numberOfIntegers =  counter + 1;

此外,它还会读取空格之间的数据。请记住这是伪代码,因此语法不同。