2016-03-02 21 views
1

我有一个典型的问题,它不是如何使用scanf函数但如何扫描初始空间中的字符串输入如何扫描初始空间用C

这是我做了什么我扫描的空间:

#include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
     int n; 
     char a[10]; 
     scanf("%d",&n); 
     scanf(" %[^\n]",a); 
     printf("%d",strlen(a)); 
     return 0; 
    } 

,当我用下面的输入运行程序:

aa bb//note there are two spaces before initial a 

,输出为6,但有8个字符,即,2 spaces其次是2 a的后跟2 spaces,然后最后2 b

我前夕尝试过的自己的功能..但唉!长度为6。这里是我的功能:

int len(char a[101]) 
{ 
    int i; 
    for(i=0;a[i];i++); 
    return i; 
} 

我认为,最初的2位被忽略了......或者我可能是错的。如果有人能解释为什么字符串的长度是6,我怎么能让它8或接受我上面提到的所有8字符,这会很棒。

编辑:这是我的实际代码

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

int main() 
{ 
    int i,N,j,k; 
    char **ans,s[101]; 

    scanf("%d",&N); 
    ans=(char **)calloc(N,sizeof(char*)); 

    for(j=0,i=0;i<N;i++) 
    { 
     scanf(" %[^\n]",s); 
     printf("%d",strlen(s)); 
     ans[i]=(char*)calloc(strlen(s),sizeof(char)); 
     for(k=0,j=((strlen(s)/2)-1);j>=0;j--,k++) 
     { 
      ans[i][k]=s[j]; 
     } 
     for(j=strlen(s)-1;j>=strlen(s)/2;k++,j--) 
     { 
      ans[i][k]=s[j]; 
     } 
    } 

    for(i=0;i<N;i++) 
    { 
     printf("%s\n",ans[i]); 
    } 

    scanf("%d",&i); 

    return 0; 
} 
+0

不能使用像表达正则表达式例如'scanf'中的''%[^ \ n]“'' – cwschmidt

+1

@cwschmidt是的。您可以。 –

+1

您的代码应该按预期工作。你确定你可以重现吗?顺便说一句,你的输入包含7个字符,而不是8. –

回答

3

OP代码应该工作张贴。

OP注释真正的代码是使用scanf(" %[^\n]",a);,它完全解释了这个问题:格式中的空间消耗了前导空白。

要解决scanf()的其他问题,请参阅以下内容。


fgets()是正确的工具。

然而,如果OP上scanf()

坚持我如何使用扫描scanf函数,但如何扫描一个字符串进入初始空间空间?

char buf[100]; 

// Scan up to 99 non\n characters and form a string in `buf` 
switch (scanf("%99[^\n]", buf)) { 
    case 0: buf[0] = '\0'; break; // line begins with `'\n` 

    // May want to check if strlen(buf)==99 to detect a long line 
    case 1: break;     // Success. 

    case EOF: buf[0] = '\0'; break; // stdin is closed. 
} 
fgetc(stdin); // throw away the \n still in stdin. 
+0

雅即使当我尝试在ideone上...它给了我8,但是当我在我的Eclipse IDE上运行它时,它会给我提供6 – Cherubim

+0

@ ch3rub7“当我运行它”时,它是“它”的发布代码或关闭它“它”? – chux

+1

实际上它是我编写的一个较大程序的一部分,我应该将其粘贴到问题中吗? – Cherubim

1

我认为问题是,你需要越来越长从指向数组不是数组本身。 试试这个,这段代码适合我。

int ArrayLength(char* stringArray) 
{ 
    return strlen(stringArray); 
} 
+0

@CoolGuy抱歉,混淆了我的语言。固定为c。 – Jacobr365

+0

为什么不直接使用'strlen'? –

+0

因为如果你不尊重它,你会得到我相信的地址长度。 – Jacobr365