如何将字符串转换为C中的数字值?

时间:2016-02-20 02:16:37

标签: c string

如果我向你们展示我的程序应该做什么的一个例子,那会更好。

输入:

  

3
  双人双端   三重双端
  四人双人三人间

输出:

  

4
  6
  24

因此,第一句Double Double表示2*2Triple Double表示3*2,依此类推。

单词End表示字符串的结尾。

看起来非常简单,但我不知道如何使用字符串并给它们一个值并从那里继续。

到目前为止,我所做的就是:

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

int main()
{

    int num_of_orders,i,j;
    char orders[25];
    char str1[25] = "Double";
    char str2[25] = "Triple";
    char str3[25] = "Quadruple";

    scanf("%d", &num_of_orders);

    for (i=0; i<num_of_orders+1; i++){
        scanf("%s", orders);
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

有许多方法可以解决这个问题,正如各种答案所表明的那样。对于如何处理C中的问题,通常没有一个正确的答案。标准库提供了各种工具,允许您针对任何问题制定许多解决方案。只要代码是正确的并且防止错误,那么选择采用哪种方法主要归结为效率问题。对于少量示例代码,这很少考虑。

要采取的一种方法是识别您不需要数据文件中的第一行(除了读取它/丢弃它以将文件位置指示符移动到数据文件的开头)第一行包含数据。)

这使您可以简单地使用面向行的输入函数(fgetsgetline)来读取文件中的其余行。 strtok然后提供了一种将每行拆分为单词的简单方法(记住删除'\n'或丢弃每行中的最后一个单词)。然后,使用strcmp比较每个单词并乘以正确的数量是一个小问题。最后,输出乘法的 product

这是一个稍微不同的方法来解决问题。程序将从作为第一个参数给出的文件名中读取(或默认情况下来自stdin):

#include <stdio.h>
#include <string.h>

enum { MAXC = 64 };

int main (int argc, char **argv) {

    char buf[MAXC] = "";    /* line buffer */
    char *delims = " \n";   /* delimiters  */
    int idx = 0;            /* line index  */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file pointer */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    while (fgets (buf, MAXC, fp)) {     /* read each line */
        if (!idx++) continue;           /* discard line 1 */
        char *p = buf;
        size_t len = strlen (p);        /* get length     */
        int prod = 1;
        if (len && buf[len-1] == '\n')  /* check for '\n' */
            buf[--len] = 0;             /* remove newline */
        printf (" %s", buf);  /* output buf before strtok */

        /* tokenize line/separate on delims */
        for (p = strtok (p, delims); p; p = strtok (NULL, delims))
        {   /* make comparson and multiply product */
            if (strcmp (p, "Double") == 0)    prod *= 2;
            if (strcmp (p, "Triple") == 0)    prod *= 3;
            if (strcmp (p, "Quadruple") == 0) prod *= 4;
        }
        printf ("  =  %d\n", prod);     /* output product */
    }

    if (fp != stdin) fclose (fp);  /* close file if not stdin */

    return 0;
}

使用/输出

$ ./bin/dbltrpl <../dat/dbltrpl.txt
 Double Double End  =  4
 Triple Double End  =  6
 Quadruple Double Triple End  =  24

仔细看看,如果您有疑问,请告诉我。

答案 1 :(得分:1)

在阅读输入时,您可以使用strtok和&#34; &#34;作为参数来分隔您从输入中读取的单词。这是一个函数,将输入中读取的所有单词填充到字符串数组中:

参数:

char ** words :您将存储输入中读取的所有单词的字符串数组

字符*输入:您阅读的输入(即&#34; Double Double end&#34;)

char * s :您将用于读取输入中的字词的分隔符(即&#34;&#34;,&#34; \ n&#34;)< / p>

void getWords(char **words, char *input, char *s){

    *words = strtok(str, s); 
    while(*words){
        words++;
            *words = strtok(NULL, s); 
    }               
    words++;
    *words=NULL;  //last element will point to NULL
}

一旦你读取输入中的单词,并且将它们填充到一个字符串数组中,你就可以做这样的事情来计算输出:

int calculate(char **words){

  int result = 1;

  while(*words){

    if (strcmp(*words, "Quadruple") == 0){

     result *= 4;

    }else if (strcmp(*words, "Triple") == 0){

      result *= 3;

    }else if (strcmp(*words, "Double") == 0){

      result *= 2;

    }else if (strcmp(*words, "End") == 0){

       return result;

    }

          words++;

  }    

}

请注意,在调用这些函数之前,您需要正确初始化您传递的参数。否则,可能会导致分段错误。

答案 2 :(得分:0)

您必须使用string.h库中的方法,例如:strcmp(比较两个字符串),strcpy(将一个字符串复制到另一个字符串)等。通常在处理 c 中的字符串操作时使用。

因为我们在编译时不知道results数组的大小,所以我们必须动态地为它分配内存。为此,我使用了mallocfree

以下是执行此操作的代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{

    int num_of_orders, i, j;
    char orders[25];
    char str1[25];
    strcpy(str1,"Double");
    char str2[25];
    strcpy(str2,"Triple");
    char str3[25];
    strcpy(str3,"Quadruple");

    scanf("%d", &num_of_orders);
    getchar();

    int *results = malloc(num_of_orders*sizeof(int));

    for (i=0; i < num_of_orders; i++)
    {
        results[i] = 1;
        strcpy(orders,"");
        while(strcmp(orders,"End") != 0)
        {
         scanf("%s", orders);
         getchar();

         if(strcmp(orders,str1)==0)
          results[i] *= 2;
         else if(strcmp(orders,str2) == 0)
          results[i] *= 3;
         else if(strcmp(orders,str3)==0)
          results[i] *= 4;
        }
    }

    for(i = 0; i < num_of_orders; i++)
     printf("%d\n", results[i]);

    free(results);

    return 0;
}

注意:此程序使用strcmp,它会进行区分大小写的比较。如果您需要不区分大小写的比较,请改用strcasecmp

答案 3 :(得分:0)

不要忘记整数的乘法可交换这一事实:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int num_of_orders, i;
    char orders[25];
    int result;
    char *ptr;

    scanf("%d", &num_of_orders);
    getchar(); // To comsume '\n'

    for (i = 0; i < num_of_orders; i++)
    {
        fgets(orders, sizeof orders, stdin);
        result = 1;
        ptr = orders;
        while(ptr = strstr(ptr, "Double"))
        {
            result *= 2;
            ptr++;
        }
        ptr = orders;
        while(ptr = strstr(ptr, "Triple"))
        {
            result *= 3;
            ptr++;
        }
        ptr = orders;
        while(ptr = strstr(ptr, "Quadruple"))
        {
            result *= 4;
            ptr++;
        }
        printf("%d\n", result);
    }
    return 0;
}

多么简单的方法!

请注意strtok()具有破坏性,即它会修改order,如果您想稍后使用它会导致一些问题。另外,我认为使用strtok()的程序可读性较差。因此,尽可能避免使用它。