2014-03-06 58 views
0

我写了一个简单的方法,从一个长字符串获取输入并打印它。我将数据保存在char数组中,并尝试将数组的最后一个元素设置为'\ 0',以便终止空值,以便我可以printf(%s,array)。C字符数组打印为字符串错误,接受空终止?

#include <stdio.h> 
#define MAX 9 
#define DEBUG 1 
int QUIT = 0; 
int assignNewBoard(void); 

void main (int argc, char *argv[]) { 
    assignNewBoard(); 

    } 

int assignNewBoard(void) { 
    int row,col , count=0,maxCount=(MAX*MAX); 
    char ch; 
    char input[maxCount+MAX]; //our buffer with room for overflow. 
          //Hopefully never more than 90chars. 

    while((ch = fgetc(stdin)) != '\n') { 
    //input checks 
    if(feof(stdin)){ 
     if(DEBUG) printf("Finished!\n"); 
     QUIT = 1; 
    } 

    count++; 
    input[count] = ch; 
    } 

    if(DEBUG)printf("::"); 

    input[count+1] = '\0'; //null termination for printing. 
    printf("%s\n",input);//This doesn't seem to happen at all in output! 

    if(DEBUG) printf("We got %d count!\n", count); 

    return 0; 
} 

但上述代码不会将我的字符数组打印为字符串!只需在:: in控制台后打印空白即可! 那么我在这里做错了什么?在我的代码中,我一直在这样工作,但现在不是这样,即使在简化的文件中也是如此!

运行时应该有一行“:(:(输入)”,但行简单地是“::”来代替。

我正在使用GCC进行编译。

+2

有什么问题? –

+0

更好地解释了问题。 – user1695505

+0

似乎对我来说很好,这取决于你真正想要做什么。编辑:它为我打印一个字符串,你使用什么IDE /编译器? –

回答

4

在对它做任何事情之前,您都会增加count,因此您读取的第一个字符为input[1]。数组索引从C中的0开始;数组中第一个字符的值input[0]是垃圾,因此您获得的输出可能会不时变化。 (行为未定义)。

您还应该特别检查一下,count永远不会太大以致于无法运行缓冲区的末端。如果发生这种情况,那么它可能会导致您的程序在别处崩溃,并且这些错误可能难以调试。

+0

良好的捕获,甚至没有编译和运行前检查计数。在代码块中适用于我,但这意味着它可能会在构建过程中尝试修复它。永远不要依靠编译器来修复你的错误:) –

+0

很好的解释!我提出了我的计数++;我的任务完成后,我总是从[0]开始,修复了一切!非常感谢! – user1695505

2

为什么你想要做所有的事情......你可以简单地这样做。扫描字符串直到\ n并打印出来。

#include<stdio.h> 
    int main(){ 
     char str[90]; 
     scanf("%[^\n]",str); 
     printf("%s",str); 
     return 0; 
    } 
+1

也许是一项家庭作业。作为一名CS导师,我在课堂上看到很多课堂上的任务,其中教师说“使用fgetc来完成此任务”或“不要使用sscanf”等。如果我曾经成为教授任何类型编程的教师,试图摆脱这种教学。教授最佳实践,然后让学生自己完成,也许在反馈过程中提出有效的最佳实践建议。 –

+0

这样更高效,我后来想到了,但我不确定如何格式化,所以我按照我所知道的去做了。请告诉我,这将返回EOF,或者我怎么能注意到我在EOF? – user1695505