如何为字符串赋值int

时间:2017-01-19 15:21:16

标签: c

我试图将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;。我在这里做错了什么?

3 个答案:

答案 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大于LENGTHstring[i]将在数组之外,这将导致缓冲区溢出并使程序崩溃。要解决此问题,请在for循环中添加以下代码:

if(i + 1 > LENGTH){
    break;
}

break语句将立即退出for循环。请注意,我们正在测试i + 1是否大于LENGTH,以便为字符串末尾的空字符留出空间。

出于同样的原因,string[sizeMe] = 0;也很糟糕,因为没有任何内容表明sizeMe小于数组的大小。相反,请使用string[i] = 0;,因为i已递增,直到达到LENGTHsizeMe。因此,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);
}

strrevstring.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