C编程(scanf高级).....专家C程序员

时间:2015-05-04 18:26:09

标签: c

我正在尝试在devC ++和Microsoft Visual Studio中引入它:

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

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

    char* filename;
    scanf(" %a[^\n]%*c",&filename);
    printf("\n%s",filename);
    free(filename);
    system("pause");
    return(0);

}

当我尝试编译代码时,我得到一个控制台,我在字符串中引入了带有空格的字符串,但是,在此之后,当程序打印字符串时,我得到了一个严谨的。

几年前,我曾经使用这种格式说明符来引入带有几个whithspaces的字符串,现在我遇到了这个问题。这是什么?。我必须使用C,没有关于使用其他语言的其他功能(如fgets)。

2 个答案:

答案 0 :(得分:1)

您的代码是赋值分配修饰符,它是GNU扩展名。它在Microsoft Visual Studio中不可用。

不幸的是,没有简单的方法可以使用无限长度的字符串。如果长度可以限制为某个固定数量,请预先分配内存缓冲区,并在格式字符串中指定限制。您还可以在自动存储上预分配缓冲区,如下所示:

var oldhash = null;

processImage: function(image_data) {
    var main_response = $q.defer();
    var hash = getImageHash(image_data);
    oldhash = hash;

    var requestsCounter = -1;

    requestImage = function(hash) {
     if(hash === oldhash){

      $http.post(apiUrl, {params: {data: hash},timeout: IMAGE_REQUEST_TIMEOUT})
       .then(function(response) {
           return main_response.resolve(response.data);
        }, function(error) {
        if (++requestsCounter < NUMBER_OF_IMAGE_REQUEST_RETRIES) {
          requestLabelsImage(hash);
        } else {
          return main_response.reject();
        }
      });

    }
    else {
      main_response.reject();
    }
   }

    requestLabelsImage(hash);

    return main_response.promise;
}

请注意,char filename[261]; scanf(" %260[^\n]%*c", filename); printf("\n%s",filename); 有一个额外的filename空终止。

答案 1 :(得分:0)

在写入指针之前为指针分配内存。然后扫描字符串

char *filename = malloc(100);
scanf("%[^\n]%*c", filename);