我正在尝试编写一个程序,将较低的套接字母转换为数字。 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;
}
你能告诉我我的代码有什么问题吗?
答案 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()
轻松构建该字符串。