2013-07-11 38 views
6

Vì vậy, tôi đang cố gắng in một chuỗi được nhập bằng cách sử dụng putch và một chút con trỏ.In chuỗi bằng cách sử dụng con trỏ với con trỏ trong C

Đây là mã hiện tại của tôi:

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

void printer(char *c); 
char *c; 
char ch; 
main(){ 
    clrscr(); 
    printf("Enter a string: "); 
    scanf("%s",&ch); 
    c = &ch; 
    printer(c); 
    getch(); 
} 


void printer(char *c){ 
    int x; 
    for(x=0;x<strlen(c);x++){ 
    putch(*c); 
    } 
} 

Vấn đề là tôi chỉ có thể in ký tự đầu tiên của chuỗi, cũng vì một lý do strlen luôn luôn trả 3 cho các chuỗi có 3 ký tự và dưới đây.

Tôi có phải sử dụng mảng cho điều này để tôi có thể sử dụng putch vì nó được giới hạn chỉ với 1 đầu ra ký tự.

+0

@Rajesh yeah tôi đã nhận điều đó, không biết tôi có thể tăng con trỏ, đã suy nghĩ của mảng như là một giải pháp mặc dù. cảm ơn bạn :) – magicianiam

+0

xin lỗi vì nhận xét trước. – rajesh6115

+0

bạn xác định một char ch có nghĩa là duy nhất char bộ nhớ để char duy nhất là hiện nay bất kỳ cách nào và vì nó là trong strlen toàn cầu (c) phải được 1. vì vậy chỉ in một lần. – rajesh6115

Trả lời

2

Một trong những vấn đề là máy in của bạn() chức năng không được in bất cứ điều gì khác hơn là ký tự đầu tiên. Có hai cách để tiếp cận điều này. Sử dụng con trỏ:

void printer(char const *c){ 
    while (*c != '\0') { 
     putch(*c); 
     c++; 
    } 
} 

Và sử dụng con trỏ số học:

void printer(char const *c) { 
    int x; 
    for (x=0; x < strlen(c); x++) { 
     putch(*(c + x)); 
    } 
} 

Vấn đề lớn nhất là bạn đang cố gắng để lưu trữ một chuỗi trong một nhân vật duy nhất trong bộ nhớ. Đó chỉ là yêu cầu cho các vấn đề.

char ch; 
scanf("%s",&ch); // NO NO NO NO NO 

Thay vì tuyên bố đệm của bạn (để lưu trữ các chuỗi trong) như là một mảng lớn, đủ cho chuỗi lớn nhất mà bạn mong đợi:

char ch[512]; 
scanf("%s", ch); 
+0

ngắn và hiệu quả. cám ơn vì cái này. mặc dù nó sẽ có thể cho bạn để cho tôi biết những gì đã sai trong mã hoặc logic của tôi. cảm ơn bạn – magicianiam

+2

@magicianTôi thật đơn giản - bạn không thay đổi ký tự bạn đang in. Nếu bạn chỉ đơn giản là thay đổi 'putch (* c)' thành 'putch (* (c + x))' nó sẽ hoạt động. Oh, và mảng của bạn nên đã được khai báo 'char ch [256];' hoặc tương tự. Bạn đang cố gắng đặt một chuỗi (một mảng nhiều ký tự) vào một biến ký tự. –

+0

liên quan đến vấn đề với strlen rằng nó sẽ luôn luôn trở lại 3, tôi đã làm điều gì đó sai cho điều đó xảy ra? cũng cảm ơn bạn đã giải thích rằng :) – magicianiam

0

Mã của bạn chỉ in ký tự đầu tiên vì c luôn trỏ đến ký tự đầu tiên của mảng. Để in tổng chuỗi bạn cần phải tăng con trỏ nhân vật cũng Bạn cần phải làm như thế này

void printer(char *c){ 
while(*c != '\0'){ 
    putch(*c); 
    c++; 
    } 
} 
+1

Bạn biết rằng kết quả của các thay đổi 'strlen (c)' trên mỗi vòng lặp vì bạn đang tăng con trỏ 'c'? Nếu độ dài chuỗi của bạn là, ví dụ, 10, sau đó khi 'x' = 5' c' sẽ trỏ đến ký tự thứ 6 và 'strlen()' sẽ trả về 5 và kiểm tra vòng lặp sẽ thất bại. Bạn sẽ không bao giờ in hơn một nửa chuỗi bằng cách sử dụng giải pháp của bạn. –

-1
#include<stdio.h> 
#include<conio.h> 
#include<string.h> 

void printer(char *c); 
char *c; 
char ch;//the ch should be a array 
main(){ 
    clrscr(); 
    printf("Enter a string: "); 
    scanf("%s",&ch);//the ch don't need '&' 
    c = &ch;//the ch don't need '&' 
    printer(c); 
    getch(); 
} 


void printer(char *c){ 
    int x; 
    for(x=0;x<strlen(c);x++){ 
    putch(*c); 
    } 
} 
+0

không có vấn đề với scanf() Vì scanf yêu cầu một chuỗi định dạng và theo địa chỉ định dạng của bộ nhớ để lưu trữ. Vì vậy, không có vấn đề với scanf – rajesh6115

2

thử mã này:

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

void printer(char *c); 
char *c; 
char buffer[1000];// use as a buffer 
void main(){ 
    clrscr(); 
    printf("Enter a string: "); 
    scanf("%s",buffer);//read the input to the buffer 
    c=(char*)malloc(strlen(buffer)+1);//alloc memory with len of input + 1 byte to "\0"(end of string) 
    strcpy(c,buffer);//copy the input from the buffer to the new memory 
    printer(c); 
    getch(); 
    free(c);//free the memeory 
} 

    void printer(char *c) 
    { 
    int x; 
    for(x=0;x<strlen(c);x++){//move the index string pointer to next char in the string 
     putch(c[x]);//print the char to the screen 
     } 
    } 

1) Bạn không thể sử dụng char để lưu một chuỗi u cần char * !!!

2) Bạn có thể nhận dữ liệu nhập vào bộ nhớ không được cấp phát !!!! vì điều đó u phải đọc đầu vào để đệm sau đó phân bổ chuỗi theo kích thước của đầu vào bên trong bộ đệm!

+1

Tôi thích câu trả lời của bạn nhưng bạn có thể vui lòng thêm giải thích về các phần của mã mà bạn đã sửa không? Nếu bạn không muốn, bạn có phiền không nếu tôi làm vậy? – nonsensickle

+1

Cũng cần cập nhật hàm printer() để cập nhật ký tự được in bởi hàm 'putch' trên mỗi lời gọi. –

+0

@PP Không cần tôi sử dụng nó như một mảng ký tự! –

0

Trước hết, bạn chuyển con trỏ tới "bộ nhớ cho một ký tự" tới scanf. Bất kỳ điều gì xảy ra sau đó đều thuộc lãnh thổ nsal demons.

Thứ hai, scanf không phân bổ bộ nhớ cho dữ liệu nhập của bạn, vì vậy ngay cả khi bạn đã vượt qua c thay vì &ch, bạn sẽ không được giảm giá nào tốt hơn.

Thứ ba, bạn thực sự cần khai báo các biến của mình bên trong main thay vì sử dụng các biến toàn cục.

Something như thế này có thể gần gũi hơn với những gì bạn thực sự muốn:

void output (char *c) 
{ 
    char *cp; 
    for (cp = c; *cp; cp++) { 
    putch(*cp); 
    } 
} 

int main (void) 
{ 
    char input[80]; 
    printf("Please input a string: "); 
    scanf("%s\n", input); 
    output(input); 
} 
+0

tôi nhận được thông báo lỗi tại đầu vào char [80]. bạn có thể giải thích cho tôi dòng chảy của cái này không? cảm ơn bạn :) – magicianiam

+0

@ magicianIam Tôi không thể thấy bất kỳ lý do rõ ràng nào tại sao bạn nên nhận được một lỗi khai báo ở đó, trừ khi tôi đã bỏ lỡ một dấu ngoặc ôm hoặc nửa tràng ở đâu đó (không, tôi chưa thử nghiệm biên dịch mã này, tôi không Dường như có một trình biên dịch tiện dụng). – Vatine

0

Đầu tiên tính toán độ dài của chuỗi & sau đó sử dụng trên thực hiện như this-

void printer(char *c){ 
    int i, length; 
    length=strlen(c) 
for(i=0;i<lenth;i++,c++){ 
    putch(*c); 
    } 
} 

Nó sẽ làm việc tôi nghĩ .

Các vấn đề liên quan