我试图将int转换成字符串。到目前为止,我通过使用scanf
获取int,然后根据它的数字拆分它,然后将每个数字放在int数组中。然后我想将所有int arr值放在一个字符串中,其中符号+或 - 将是第一个字符。这是我的代码:
#include <stdio.h>
#include <string.h>
#define LENGTH 50
int getLength(int num, int arr[]);
int main()
{
int num = 0, i = 0;
int arr[LENGTH] = {0};
char string[LENGTH] = {0};
printf("enter number: ");
scanf("%d", &num);
int sizeMe = getLength(num, arr);
string[2] = arr[2] + '0';
printf("length %d one of values: %c", sizeMe,string[2]);
for(i = 1; i < sizeMe + 1; i++);
{
string[i] = arr[sizeMe - i] + '0';
}
string[0] = '+';
string[sizeMe] = 0;
printf("string: %s", string);
}
int getLength(int num,int arr[])
{
int count = 0;
int i = 0, temp = 0;
while(num != 0)
{
temp = num%10;
num /= 10;
count++;
i++;
arr[i] = temp;
printf("index %d is %d\n",i,arr[i]);
}
return count;
}
该程序的输出只是&#39; +&#39;。我在这里做错了什么?
答案 0 :(得分:2)
导致代码无法正常工作的问题是您在for
语句之后有一个分号,如下所示:
for(i = 1; i < sizeMe + 1; i++);
{
string[i] = arr[sizeMe - i] + '0';
}
该代码与此相同:
for(i = 1; i < sizeMe + 1; i++){}
string[i] = arr[sizeMe - i] + '0';
那么正在发生的事情是只写入string
的最后一个元素,其余部分留空,这会产生未定义的行为。要解决此问题,请删除分号。我还建议将{
放在for语句行的末尾而不是新行,因为这样做会阻止你犯这样的错误。因此,这是正确的代码,格式化为我建议格式化的方式:
for(i = 1; i < sizeMe + 1; i++){
string[i] = arr[sizeMe - i + 1] + '0';
}
请注意,您还忘记了+1
中的arr[sizeMe - i + 1]
。
尽管错误导致您的代码无法按照您希望的方式工作,但您还犯了其他一些错误,这些错误可能会导致您的程序崩溃。
首先,在for循环中,您不会测试i
是否大于LENGTH
。问题是如果i
大于LENGTH
,string[i]
将在数组之外,这将导致缓冲区溢出并使程序崩溃。要解决此问题,请在for循环中添加以下代码:
if(i + 1 > LENGTH){
break;
}
break
语句将立即退出for循环。请注意,我们正在测试i + 1
是否大于LENGTH
,以便为字符串末尾的空字符留出空间。
出于同样的原因,string[sizeMe] = 0;
也很糟糕,因为没有任何内容表明sizeMe
小于数组的大小。相反,请使用string[i] = 0;
,因为i
已递增,直到达到LENGTH
或sizeMe
。因此,i
将是这两个值中的最小值,这正是我们想要的。
您还需要在main
函数的末尾返回一些内容。 main
函数的类型为int
,因此它应返回int
。在C ++中,由于这个原因,这段代码无法编译。您使用C和C编译器编译的代码通常比C ++编译器更容忍,因此您只会收到警告。确保修复所有编译器警告,因为这样做可以解决错误。警告可以帮助你,而不是惹恼你。通常,main
函数应返回0,因为此值通常意味着一切顺利。因此,您需要在return 0;
函数的末尾添加main
。
因此,这是您应该使用的代码:
#include <stdio.h>
#include <string.h>
#define LENGTH 50
int getLength(int num, int arr[]);
int main(){
int num = 0, i = 0;
int arr[LENGTH] = {0};
char string[LENGTH] = {0};
printf("enter number: ");
scanf("%d", &num);
int sizeMe = getLength(num, arr);
string[2] = arr[2] + '0';
printf("length %d one of values: %c", sizeMe,string[2]);
for(i = 1; i < sizeMe + 1; i++){
string[i] = arr[sizeMe - i + 1] + '0';
if(i + 1 > LENGTH){
break;
}
}
string[0] = '+';
string[i] = 0;
printf("string: %s", string);
return 0;
}
int getLength(int num,int arr[]){
int count = 0;
int i = 0, temp = 0;
while(num != 0){
temp = num%10;
num /= 10;
count++;
i++;
arr[i] = temp;
printf("index %d is %d\n",i,arr[i]);
}
return count;
}
另外,正如一些程序员在评论中指出的那样,使用sprintf
要容易得多。然后你的代码会简单得多:
#include <stdio.h>
#include <string.h>
#define LENGTH 50
int main(){
int num = 0;
char string[LENGTH] = {0};
printf("enter number: ");
scanf("%d", &num);
sprintf(string, "%c%d", num >= 0 ? '+' : '-', num);
printf("string: %s", string);
return 0;
}
答案 1 :(得分:0)
将C int转换为十进制字符串的简短答案是调用sprintf()。这导致了sprintf()如何做到的问题。
从 C编程语言,第2版部分 3.6 一书中。有一个函数的例子,它返回一个整数的字符串表示。所以这是代码:
void numberToString(int n, char *s){
int i, sign;
if ((sign = n) < 0) /*record sign*/
n = -n; /* make n positive */
i = 0;
do { // generate digits in reverse order
s[i++] = n % 10 + '0'; // get next digit*/
} while ((n /= 10) > 0); // delete it
s[i++] = sign < 0? '-': '+'; // or -- if(sign < 0) s[i++] = '-'; -- if you want just the sign '-'
s[i] = '\0';
strrev(s); //reverse the string
}
int main()
{
int n;
char str[LENGTH];
printf("Number: ");
scanf("%i", &n);
numberToString(n, str);
printf("Number as string: %s\n", str);
}
strrev
在string.h
标题中定义(包括它)。
答案 2 :(得分:0)
您可以尝试使用sprintf
执行此操作。从int temp = *pX // There should be a `;`
计算数字长度时,可以静态或动态地声明字符串缓冲区。声明后,您可以使用get_length()
在缓冲区中发送格式化的输出。
但是,如果您仍希望继续使用您的方法,@ Donald Duck已经解决了调试代码的问题,这只是您可以使用的另一种方法。
以下是一个例子:
sprintf()
示例输入1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
size_t get_length(int number);
int main(void) {
int number;
size_t numcnt;
char *string;
printf("Enter number: ");
if (scanf("%d", &number) != 1) {
printf("Invalid number entered\n");
exit(EXIT_FAILURE);
}
printf("Number = %d\n", number);
numcnt = get_length(number);
string = malloc(numcnt+1);
if (!string) {
printf("Cannot allocate %zu bytes for string\n", numcnt+1);
exit(EXIT_FAILURE);
}
sprintf(string, "%d", number);
printf("String = %s\n", string);
free(string);
return 0;
}
size_t get_length(int number) {
size_t count = 0;
if (number < 0) {
number *= -1;
count++;
}
for (size_t i = number; i > 0; i /= 10) {
count++;
}
return count;
}
示例输出1:
Enter number: 1234
示例输入2:
Number = 1234
String = 1234
示例输出2:
Enter number: -1234