2013-08-13 82 views
5

Tôi vẫn còn mới đối với diễn đàn vì vậy tôi xin lỗi trước cho các vấn đề diễn đàn - nghi thức.Sự khác biệt giữa mảng/chuỗi int/char

Tôi không hiểu sự khác biệt giữa các mảng intchar. Gần đây tôi đã viết một chương trình cho một vấn đề Project Euler ban đầu sử dụng một mảng char để lưu trữ một chuỗi số, và sau đó gọi là các ký tự cụ thể và cố gắng sử dụng các hoạt động int trên chúng để tìm sản phẩm. Khi tôi sử dụng một chuỗi char tôi nhận được một sản phẩm vô cùng lớn, rõ ràng là không chính xác. Ngay cả khi tôi chuyển đổi những gì tôi nghĩ sẽ được biên dịch như một nhân vật (str[n]) đến một số nguyên trong dòng ((int)str[n]) nó đã làm điều tương tự. Chỉ khi tôi thực sự sử dụng một mảng số nguyên nó đã làm việc.

Mã là như sau

cho char chuỗi

char str[21] = "73167176531330624919"; 

này đã không làm việc. Tôi có một câu trả lời khoảng 1,5 nghìn tỷ cho một câu trả lời đáng lẽ phải có khoảng 40k.

cho int mảng

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9}; 

Đây là những gì đã làm việc. Tôi cũng đã tắt quá trình truyền nội tuyến.

Bất kỳ giải thích nào về lý do tại sao những điều này hoạt động/không hoạt động và bất kỳ điều gì có thể dẫn đến hiểu rõ hơn về những ý tưởng này sẽ được đánh giá cao. Liên kết đến các công cụ hữu ích là tốt. Tôi đã nghiên cứu chuỗi và mảng và con trỏ rất nhiều (của riêng tôi) (tôi tự học như tôi đang học trung học) nhưng các khái niệm vẫn còn khó hiểu.

Câu hỏi phụ là các chuỗi trong C được lưu trữ tự động dưới dạng mảng hay chỉ có thể thực hiện như vậy?

+3

Có lẽ [bảng này] (http://www.asciitable.com) có thể làm sáng tỏ việc bạn xử lý các ký tự ascii dưới dạng giá trị 'int'. Và có, nếu bằng 'mảng' bạn có nghĩa là bộ nhớ tiếp giáp có chứa các dữ liệu ký tự cơ bản, chúng được lưu trữ như vậy (với một 0 terminator ngầm tacked trên). – WhozCraig

+0

bảng đó có nói rằng char '0' tương ứng với giá trị int là 48 không? – Charles

+0

Có, mặc dù giá trị chưa được ký, điều này có vẻ không quan trọng nhưng sẽ là như vậy nếu bạn cần xử lý các ký tự ascii mở rộng (xem bảng ngay bên dưới ký tự đó). Bạn đang đi đúng hướng. Một số câu trả lời dưới đây mô tả điều này tốt hơn. Cũng lưu ý rằng điều này ('0' == 48) chỉ đúng đối với ASCII. Có các bộ ký tự phụ thuộc vào hệ thống khác (chẳng hạn như [EBCDIC] (http://en.wikipedia.org/wiki/EBCDIC)). – WhozCraig

Trả lời

4

Để xây dựng câu trả lời của WhozCraig, sự cố bạn gặp phải không liên quan đến chuỗi, nhưng với các ký tự riêng lẻ.

Chuỗi trong C được lưu trữ bởi và lớn như mảng ký tự (với báo trước rằng có tồn tại một terminator null ở cuối).

Bản thân các ký tự được mã hóa trong một hệ thống gọi là ascii gán mã từ 0 - 127 cho các ký tự được sử dụng bằng ngôn ngữ tiếng Anh (chỉ). Vì vậy, "7" không được lưu trữ dưới dạng 7 nhưng mã hóa ascii là 7, là 55.

Tôi nghĩ rằng bây giờ bạn có thể thấy tại sao sản phẩm của bạn quá lớn.

Một cách thanh lịch để sửa chữa sẽ được chuyển đổi

int num = (int) str[n]; 

để

int num = str[n] - '0'; 
//thanks for fixing, ' ' is used for characters, " " is used for strings 

giải pháp này sẽ trừ mã ascii 0 từ mã ascii cho nhân vật của bạn, hãy nói "7". Vì các con số được mã hóa tuyến tính, điều này sẽ hoạt động (đối với các số có một chữ số).Để có số lớn hơn, bạn nên sử dụng atoi hoặc strtol từ stdlib.h

+0

Tôi thích ý tưởng của bạn về việc chuyển đổi mã trở lại các chữ số của tôi mà tôi muốn. Đó là, như bạn nói, thanh lịch :) – Charles

+0

@ user2673602 Cảm ơn, Vui vì tôi có thể giúp! –

+1

Tôi sẽ đề nghị ['strtol()'] (http://en.cppreference.com/w/c/string/byte/strtol) cho các chuyển đổi, nhưng ý tưởng là ở đó. – WhozCraig

3

Chuỗi chỉ là mảng ký tự có byte kết thúc null. Không có loại dữ liệu chuỗi riêng biệt trong c.

Khi sử dụng char làm số nguyên, giá trị ascii dạng số được sử dụng. Ví dụ: nói một cái gì đó như printf("%d\n", (int)'a'); sẽ dẫn đến 97 (giá trị ascii của 'a') được in.

Bạn không thể sử dụng một chuỗi số để thực hiện các phép tính số trừ khi bạn chuyển đổi nó thành một dãy số nguyên. Để chuyển đổi một chữ số như một nhân vật thành dạng số nguyên của nó, bạn có thể làm một cái gì đó như thế này:

char a = '2'; 
int a_num = a - '0'; 
//a_num now stores integer 2 

Điều này làm cho giá trị ascii của '0' (48) sẽ được trừ vào giá trị ascii '2' (50) , cuối cùng rời khỏi 2.

2
char str[21] = "73167176531330624919" 

mã này tương đương với

char str[21] = {'7','3','1','6','7','1','7','6','5',/ 
       '3','1','3','3','0','6','2','4','9','1','9'} 

vì vậy bất cứ lưu trữ trong str [21] không phải là con số, nhưng các char (ASCII của họ đại diện tương đương là khác nhau).

câu hỏi trả lời phụ - có/không, chuỗi được tự động lưu trữ dưới dạng mảng char, nhưng chuỗi có ký tự phụ ('\ 0') làm phần tử cuối cùng (trong đó mảng char không có phần tử như vậy).