在C中将字符串转换为数字
Converting string to number in C
我正在尝试编写一个将小写字母表转换为数字的程序。
一个 -> 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] != '[=10=]'; 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;
}
你能告诉我我的代码有什么问题吗??
我看到的一个问题是:
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';
会更好
你在一个未初始化的数组上使用 strcat()
,result
,它不会那样工作,strcat()
在它的第一个参数中寻找终止的 nul
字节, 并从该点粘贴第二个参数。
在你的情况下没有 '[=17=]'
结果,调用 strcat()
并使用 result
作为第一个参数会导致未定义的行为。
你至少应该确保结果中有一个'[=17=]'
,你可以通过将result
的第一个元素设置为'[=17=]'
来做到这一点,比如
result[0] = '[=10=]';
在循环开始之前,你还传递了第二个参数src
,它是一个数组但不是字符串,因为它没有终止符'[=17=]'
,但你实际上不需要数组或 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()
.
轻松构建该字符串
我正在尝试编写一个将小写字母表转换为数字的程序。 一个 -> 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] != '[=10=]'; 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;
}
你能告诉我我的代码有什么问题吗??
我看到的一个问题是:
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';
会更好
你在一个未初始化的数组上使用 strcat()
,result
,它不会那样工作,strcat()
在它的第一个参数中寻找终止的 nul
字节, 并从该点粘贴第二个参数。
在你的情况下没有 '[=17=]'
结果,调用 strcat()
并使用 result
作为第一个参数会导致未定义的行为。
你至少应该确保结果中有一个'[=17=]'
,你可以通过将result
的第一个元素设置为'[=17=]'
来做到这一点,比如
result[0] = '[=10=]';
在循环开始之前,你还传递了第二个参数src
,它是一个数组但不是字符串,因为它没有终止符'[=17=]'
,但你实际上不需要数组或 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()
.