문자 배열을 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
'programing' 카테고리의 다른 글
C#의 수식에 셀에 오류가 있는지 확인하는 방법 (0) | 2023.06.09 |
---|---|
VueX Store에서 계산된 속성으로 Ajax를 호출하는 올바른 방법은 무엇입니까? (0) | 2023.06.09 |
VUE 경로 리디렉션이 다른 페이지에서 모달을 닫지 않음 (0) | 2023.06.09 |
VBA에서 C++ DLL로 문자열 전달 중 (0) | 2023.06.09 |
FCM을 사용하여 특정 사용자에게 알림을 보내는 방법은 무엇입니까? (0) | 2023.06.09 |