【问题标题】:Converting string to number in C在C中将字符串转换为数字
【发布时间】:2015-05-22 01:13:19
【问题描述】:

我正在尝试编写一个将小写字母转换为数字的程序。 一个-> 01 b -> 02 ... z -> 26

对于前九个字母,我需要在数字前加一个 0。

这是我的代码。

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


#define MAXLEN 128

void s2n(char str[])
{

  int i;
  char x;
  char result[256];

  for (i=0; str[i] != '\0'; i++) {
    x = str[i];
    x = x - 96;


    if (x < 10) {

      char src[2] = {0, x};
      strcat(result, src);
    }
    else {
      char src2[1] = {x};
      strcat(result, src2);
    }

    printf("%s",  result);

  }

}

int main(void)
{
  char str[MAXLEN];

  printf("Lower cased string please: ", MAXLEN);
  scanf("%s", str);

  s2n(str);

  return 0;

}

你能告诉我我的代码有什么问题吗?

【问题讨论】:

    标签: c strcat


    【解决方案1】:

    我看到的一个问题是:

      char src[2] = {0, x};
    

    你想使用 字符 0,而不是字节值 0 (NUL):

      char src[2] = {'0', x};
    

    另外,您需要 NUL 终止您的 src 数组:

      char src[] = {'0', x, 0};
    

    在这两种情况下都需要完成 NUL 终止。

    另一个问题是您的x = x - 96 语句也没有考虑到字符 0 与字节值 0 不同。所以

    x = x - 96 + '0';
    

    会更好。

    【讨论】:

      【解决方案2】:

      您在一个未初始化的数组result 上使用strcat(),它不起作用,strcat() 在它的第一个参数中查找终止的nul 字节,并从该点粘合第二个参数。

      在您的情况下,结果中没有'\0',使用result 作为第一个参数调用strcat() 会导致未定义的行为。

      你至少应该确保结果中有一个'\0',你可以通过将result的第一个元素设置为'\0'来做到这一点,比如

      result[0] = '\0';
      

      在循环开始之前,您还传递了第二个参数src,它是一个数组但不是字符串,因为它没有终止'\0',但实际上您不需要数组也不需要strcat() .

      您可以使用索引变量并将数组的 ith 元素赋值给从原始值计算的实际字符,例如

      result[i] = x;
      

      那么你不会 nul 终止 result,这会在你尝试打印 resutl 时导致未定义的行为。

      您还向 printf() 传递了一个参数,但它不希望有一个参数,这表明您正在静音或忽略编译器警告。

      你的代码有很多问题,下面的代码,做你想做的事

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      void s2n(char chr)
      {
          char result[4];
          if (snprintf(result, sizeof(result), "%02d", 1 + chr - 'a') >= sizeof(result))
              return;
          printf("%s",  result);
      }
      
      int main(void)
      {
          char chr;
      
          printf("Lower cased string please: ");
          if (scanf(" %c", &chr) != 1)
          {
              fprintf(stderr, "input error!\n");
              return -1;
          }
          s2n(chr);
      
          return 0;
      }
      

      请注意,除了要存储结果的字符串之外不需要任何字符串,您可以使用sprintf() 轻松构建。

      【讨论】:

        猜你喜欢
        • 2020-09-14
        • 2021-05-09
        • 2014-05-02
        • 2020-02-20
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多