programing

문자 배열을 C의 정수로 변환

css3 2023. 6. 9. 22:18

문자 배열을 C의 정수로 변환

다음과 같은 문자 배열[]을(를) 변환합니다.

char myarray[4] = {'-','1','2','3'}; //where the - means it is negative

따라서 C의 표준 라이브러리를 사용하는 정수: -1234여야 합니다.저는 그것을 하는 우아한 방법을 찾을 수 없었습니다.

\0'을 확실히 추가할 수 있습니다.

저는 개인적으로 좋아하지 않습니다.atoi기능.제가 제안하고 싶습니다sscanf:

char myarray[5] = {'-', '1', '2', '3', '\0'};
int i;
sscanf(myarray, "%d", &i);

그은매표입니다적은, 것그것준에 .stdio.h:) 도서관 :)

그리고 제 생각에는, 그것은 당신에게 훨씬 더 많은 자유를 허용합니다.atoi숫자 문자열의 임의 형식을 지정할 수 있으며, 마지막에 숫자가 아닌 문자도 허용할 수 있습니다.

편집 저는 여기 사이트에서 3가지 다른 방법을 설명하고 비교하는 멋진 질문을 발견했습니다.atoi,sscanf그리고.strtol또한 보다 상세한 정보를 제공합니다.sscanf, (, 족가가▁of전▁(▁family▁whole)의 가족 전체*scanf함수)를 선택합니다.

EDIT2 개인적으로 싫어하는 것은 저뿐만이 아닌 것 같습니다.atoi기능.다음은 다음과 같은 답변에 대한 링크입니다.atoi함수가 더 이상 사용되지 않으므로 최신 코드에서는 사용할 수 없습니다.

그냥 장난감을 사용하는 게 어때요?예:

char myarray[4] = {'-','1','2','3'};

int i = atoi(myarray);

printf("%d\n", i);

기대했던 대로 제공합니다.

-123

업데이트: 그렇지 않은 이유 - 문자 배열이 null로 종료되지 않았습니다.도!

배열을 문자열로 변환하지 않고 문자 배열 자체를 처리하는 것은 그리 어렵지 않습니다.특히 문자 배열의 길이를 알고 있거나 쉽게 찾을 수 있는 경우.문자 배열의 경우 배열 정의와 동일한 범위에서 길이를 결정해야 합니다. 예:

size_t len sizeof myarray/sizeof *myarray;

에대서는, 론물당, 은신해끈이 .strlen이용할 수 있는.

길이를 알면 문자 배열인지 문자열인지에 관계없이 문자 값을 다음과 유사한 짧은 함수를 가진 숫자로 변환할 수 있습니다.

/* convert character array to integer */
int char2int (char *array, size_t n)
{    
    int number = 0;
    int mult = 1;

    n = (int)n < 0 ? -n : n;       /* quick absolute value check  */

    /* for each character in array */
    while (n--)
    {
        /* if not digit or '-', check if number > 0, break or continue */
        if ((array[n] < '0' || array[n] > '9') && array[n] != '-') {
            if (number)
                break;
            else
                continue;
        }

        if (array[n] == '-') {      /* if '-' if number, negate, break */
            if (number) {
                number = -number;
                break;
            }
        }
        else {                      /* convert digit to numeric value   */
            number += (array[n] - '0') * mult;
            mult *= 10;
        }
    }

    return number;
}

위는 몇 가지 추가 조건이 포함된 표준 chartoint 변환 접근법입니다.길 잃은 캐릭터들을 다루기 위해서, 그리고.digits그리고.'-'유일한 요령은 숫자 수집을 시작할 때와 중지할 때에 대해 현명한 선택을 하는 것입니다.

이 수집을 시작한다면.digits첫 번째를 만났을 때 전환을 위해.digit그런 다음 첫 번째를 만나면 변환이 종료됩니다.'-'또는non-digit ( )와 같은 인덱스에 관심이 때 더 해집니다.file_0127.txt).

사용에 대한 간단한 예:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int char2int (char *array, size_t n);

int main (void) {

    char myarray[4] = {'-','1','2','3'}; 
    char *string = "some-goofy-string-with-123-inside";
    char *fname = "file-0123.txt";

    size_t mlen = sizeof myarray/sizeof *myarray;
    size_t slen = strlen (string);
    size_t flen = strlen (fname);

    printf ("\n myarray[4] = {'-','1','2','3'};\n\n");
    printf ("   char2int (myarray, mlen):  %d\n\n", char2int (myarray, mlen));

    printf (" string = \"some-goofy-string-with-123-inside\";\n\n");
    printf ("   char2int (string, slen) :  %d\n\n", char2int (string, slen));

    printf (" fname = \"file-0123.txt\";\n\n");
    printf ("   char2int (fname, flen)  :  %d\n\n", char2int (fname, flen));

    return 0;
}

참고: 직면한 경우'-'구분된 파일 인덱스(또는 유사), 결과를 부정하는 것은 사용자에게 달려 있습니다.(예:file-0123.txt와 비교하여file_0123.txt최초의 사람이 돌아올 곳-123제2차 세계대전 중에123).

출력 예제

$ ./bin/atoic_array

 myarray[4] = {'-','1','2','3'};

   char2int (myarray, mlen):  -123

 string = "some-goofy-string-with-123-inside";

   char2int (string, slen) :  -123

 fname = "file-0123.txt";

   char2int (fname, flen)  :  -123

참고: 문제가 발생할 수 있는 코너 케이스 등은 항상 존재합니다.이는 모든 문자 집합 등에서 100% 방탄 기능을 제공하기 위한 것이 아니라, 대부분의 시간을 작업하고 필요한 초기 구문 분석 또는 문자열로 변환하지 않고도 추가적인 변환 유연성을 제공합니다.atoi또는strtol,기타.

따라서 문자 번호(예: '8')를 정수 식으로 변환하는 것이 좋습니다.예를 들어 ch = '8', inti = c - '0' //는 정수 8을 생성합니다. 그리고 908=9*100+0*10+8이라는 원리로 변환된 모든 숫자를 합합니다.

char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly.

int s = 1;
int i = -1;
int res = 0;

if (c[0] == '-') {
  s = -1;
  i = 0;
}

while (c[++i] != '\0') { //iterate until the array end
  res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers.
}

res = res*s; //answer: -908

질문이 묻는 것은 아니지만 stdin에서 null 종단 처리된 문자 배열에 대해 @Rich Drummond의 답변을 사용했습니다.

char *buff;
size_t buff_size = 100;
int choice;
do{
    buff = (char *)malloc(buff_size *sizeof(char));
    getline(&buff, &buff_size, stdin);
    choice = atoi(buff);
    free(buff);
                    
}while((choice<1)&&(choice>9));

언급URL : https://stackoverflow.com/questions/10204471/convert-char-array-to-a-int-number-in-c