2012-11-19 68 views
1

我有一個非常簡單的程序來打印字符的字符串,但由於某種原因,它不工作:打印字符串中的所有字符用C

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

void * print_chars(char *process_string) { 
    int i; 
    int string_len; 

    string_len = strlen(process_string); 

    printf("String is %s, and its length is %d", process_string, string_len); 

    for(i = 0; i < string_len; i++) { 
     printf(process_string[i]); 
    } 

    printf("\n"); 
} 

int main(void) { 
    char *process_string; 

    process_string = "This is the parent process."; 

    print_chars(process_string); 

    return 0; 
} 

當我在Netbeans中運行它,我得到的以下:

RUN FAILED (exit value 1, total time: 98ms) 

如果我刪除線

printf(process_string[i]); 

程序運行,但沒有打印到控制檯(明顯)。

任何想法我在這裏失蹤?

+4

通過將C++標記放在那裏,當有人告訴你只使用'std :: string'和'std :: string :: length'時,你應該接受它。 – chris

+3

您是否正在關注您嘗試編譯時得到的警告? – antlersoft

+1

爲什麼你的'print_chars'函數返回一個'void *'?並打印字符串,使用'printf(「%s」,process_string);' – Praetorian

回答

4

有幾個問題。

其中之一是您沒有看到printf("String is %s, and its length is %d", ...)的任何輸出。這是因爲默認情況下標準輸出是行緩衝的,並且不包含換行符,所以它實際上決不會確定有一行可以打印。如果您更改格式字符串以添加\n,則會看到此命令的輸出。

第二個問題是,您將char傳遞到printf()的第一個參數中,它預計爲char *。這導致它崩潰,因爲它試圖將該字符解釋爲指針。您想要傳遞類似printf(process_string)的內容。然而,將一個變量字符串直接傳遞給printf()的第一個參數通常是一個壞主意;相反,您應該傳遞一個包含%s的格式字符串,並將該字符串作爲相應參數傳入:printf("%s\n", process_string)。或者,如果要逐字符打印,請輸入printf("%c", process_string[i]),然後按printf("\n")刷新緩衝區並實際查看輸出。或者,如果您按字符進行操作,則putchar(process_string[i])將比printf()更簡單。

9

需要在線路

printf(process_string[i]); 

printf("%c", process_string[i]); 
+2

是的,我驚訝實際編譯的發佈代碼。但是,也許發佈的代碼是不正確的。 – john

+0

我也希望大家閱讀手冊頁並理解它。 –

+0

這是正確的解決方案,但是您沒有解釋爲什麼舊代碼錯誤:計算機試圖將字符解釋爲內存地址,並且從不存在的地址讀取會導致程序崩潰。 – ams

1

printf()期望的格式,作爲第一個參數,一個字符指針。你傳遞的是一個char,而不是一個指針。

無論如何,printf()是不是在這裏使用的功能。嘗試putc() ...