2017-02-12 65 views
2
printf("Enter name: "); 
scanf("%s", first); 
int s = sizeof(first); 
for(i = 0; i < s; i++){ 
    if(s < 2 || s > 20){ 
     printf("improper array size"); 
    } 
} 
fprintf(fptr,"NAME: %s \n",first); 

代碼檢查數組大小是否小於2或大於20,但它似乎不工作。這是爲什麼?陣列大小的條件不產生任何輸出 - C

回答

2

您應該使用strlen(3)來獲取輸入的長度。 sizeof將返回該類型的機器尺寸。

3

char first[100]; 
printf("Enter name: "); 
scanf("%s", first); 
printf("%zu\n", sizeof(first)); 
printf("%zu\n", strlen(first)); 

輸出

Enter name: Wasi 
100 
4 
  • printf("%zu\n", sizeof(first)); - 炭陣列是100
  • printf("%zu\n", strlen(first));的打印尺寸 - 輸出也就是4輸入字符串的長度。

更新

。在你的if條件沒有問題。在上面給出的示例中,如果我添加以下代碼段 -

for(int i = 0; i < s; i++){ 
    if(s < 2 || s > 20){ 
     printf("improper array size\n"); 
    } 
} 

它輸出消息 - improper array size 100倍,其是陣列first的大小。

+0

謝謝你,更有意義! 但問題是,if語句不起作用? – Rgoat

+0

應該是'scanf(「%99s」,第一個);'。 – RoadRunner

+0

@Rgoat我在if條件中沒有看到任何問題。請明確提及你在帖子中面臨的問題(不要在評論中提及)。另外,顯示你如何聲明變量'first'。 –

2

他們是一對夫婦與您的代碼的問題:

  • scanf("%s", first)是不夠的,因爲它不檢查緩衝區溢出。如果你的字符數組是first[100],那麼你需要使用scanf("%99s", first)。格式說明符必須比目標數組小1,以便在最後考慮'\0'。如果我們也可以看到first的聲明會很有幫助。
  • sizeof(first)只會得到你的數組中的字節數。如果您再次使用char first[100]sizeof(first)將評估爲100

    sizeof返回存儲提供的類型或變量所需的字節數。

    注:sizeof是運營商,而不是一個函數。不使用括號是可以接受的。

    正如其他人所說,您可以使用strlen(),或者直接找到,它是標記數組末尾的空終止符。這裏有一個例子:

    char first[100]; 
    printf("Enter name: "); 
    scanf("%99s", first); 
    for(size_t i = 0; first[i] != '\0'; i++) { /* Or i < strlen(first) */ 
    
  • if說法似乎很奇怪,我看不出它如何與循環綁英寸另外,爲什麼你檢查s < 2 || s > 20有效的數組大小?如果聲明大小爲10的數組,那麼這是有效的數組大小。如果您已經使用s這樣的:

    int s = sizeof(first); 
    

    然後s只會目標數組的大小。我只能假設你想檢查2或更多字符必須存在,並且不能超過20。雖然,這取決於多少字節first佔據。如果是這種情況,那麼你需要稍微改變你的代碼。像這樣的東西可以工作:

    size_t slen = strlen(first); 
    if (slen < 2 || slen > 20) { 
        printf("invalid name size\n"); 
    } 
    

    這比較找到你的界限字符的數量。它驗證名稱只能在220個字符之間。爲了這樣的檢查是合適的,那麼first的尺寸必須大於20。否則,檢查slen < 2就足夠了。