在C中将字符串转换为数字

时间:2015-05-22 01:13:19

标签: c strcat

我正在尝试编写一个程序,将较低的套接字母转换为数字。     a - > 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;

}

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

2 个答案:

答案 0 :(得分:0)

我看到的一个问题是:

  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';

会更好。

答案 1 :(得分:0)

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

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

您至少应该确保结果中只有一个'\0',只需将result的第一个元素设置为'\0'即可,例如

result[0] = '\0';

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

您可以使用索引变量,只是将数组的i元素分配给从原始值计算的实际字符,例如

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()轻松构建该字符串。