2012-11-19 67 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() ...