printf限制为三个字符?

时间:2011-09-19 03:57:01

标签: c printf

我已经将这个函数解决了导致问题的原因,但是我会尝试为这个问题提供足够的上下文,而不会让你仔细阅读文本的行和行:

基本上,我在下面的函数中输入一个字符串,如果字符串中的第一个字符是#,那么我想打印字符串。就是这样。

但是,执行此操作时,打印的字符串将以三个字符的长度剪切。例如,输入字符串为“ #Hello,World!”的地方只会打印“ #H ”。

我使用以下输入文件中的fgets()获取输入字符串:

  

#测试
  #######
  #更多

输出如下:

  

#T
  ###
  ###
  #
  
  #M

以下是相关的修剪功能:

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

    FILE    *input;
    lineResponse response;

    //If a filename was specified, the file exists, and it is openable
    if(argv[1] != NULL && (input = fopen(argv[1],"r")) != NULL){
        char *currentLine = "";
        //Loop through the lines
        while(fgets(currentLine,sizeof(input),input)){
            response = parseLine(currentLine);
        }
    }

    fclose(input);

    getchar();

}

lineResponse parseLine(char *line){
    lineResponse response = {0,NULL}; //0 is the default lineType, denoting a line that cannot be parsed
    if(line != NULL){
        if(line[0] == '#'){
            printf("%s\n",line);
        }
    }
    return response;
}

lineResponse返回与此问题无关。什么可能导致修剪?如果您需要更广泛的示例,我可以提供一个。

2 个答案:

答案 0 :(得分:6)

char *currentLine = "";
 //Loop through the lines
 while(fgets(currentLine,sizeof(input),input)){

这是你的问题。您正在声明一个char指针并为其指定一个字符串文字...然后尝试读入它。你似乎也不理解fgets的第二个论点;它读取的字符数少于该字符数,并使用\0终止缓冲区。另请注意,换行符存储在缓冲区中,如果您不想要它们,则需要将其删除。

这应该是:

char currentLine[1024]; /* arbitrary - needs to be big enough to hold your line */
while(fgets(currentLine,1024,input)) {

字符串文字(例如char* = "This is a string literal")是不可变的(只读)。它们是在编译时创建的。

答案 1 :(得分:4)

问题必须在于你如何阅读这条线。由于您评论您正在阅读fgets(),我将猜测您是在32位计算机上,并且您有一些类似的代码:

char buffer[128];

if (fgets(&buffer, sizeof(&buffer), stdin))
{
    lineResponse r = parseLine(buffer);
    ...
}

还有其他类似的技巧:

char *buffer;
if (fgets(buffer, sizeof(buffer), stdin))
    ...

这里发生的是你向fgets()提供了错误的大小(和错误的地址),并且它的总大小为4,这意味着它只能存储3个字符加上终止的NUL '\0'

正确的代码可能是:

char buffer[128];

if (fgets(buffer, sizeof(buffer), stdin))
{
    lineResponse r = parseLine(buffer);
    ...
}

或者:

char *buffer = malloc(2048);
// error check memory allocation!
if (fgets(buffer, 2048, stdin))
    ...

现在代码可见......

您的代码显示为:

    char *currentLine = "";
    //Loop through the lines
    while(fgets(currentLine,sizeof(input),input)){
        response = parseLine(currentLine);

这确实对应于(或多或少)我假设的char *buffer;版本。您在sizeof(input)声明FILE *input;时使用currentLine进行了额外调整。如果将char *保留为 char currentLine[2048]; //Loop through the lines while (fgets(currentLine, sizeof(currentLine), input)) { response = parseLine(currentLine); ... } ,或者(更简单,因为没有动态分配的内存泄漏),您需要调整我的第二个建议替代方案,使用:

{{1}}