2015-12-04 38 views
-1

我有一個從我的大學關於電話簿的小項目。我有一個小問題來驗證名稱的第一個字符,我使用ascii來驗證名稱的第一個字符。名稱的第一個字符應該是(A-Z)或(a-z),有人可以幫我解決我的問題嗎?謝謝!在c編程中的輸入驗證

#pragma warning (disable:4996) 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(){ 
    char name[30]; 
    int flag; 
    int i; 

    printf("Add New Contact\n"); 

    start: 
    do { 
     printf("input name[1..30 chars]: "); 
     scanf("%s", name); fflush(stdin); 

     for (i = 0; i < strlen(name); i++) { 
     if (name[1] >= 65 && name[1] <= 90 || name[1] >= 97 && name[1] <= 122) { 
      flag = 1; 
     } 
     else { 
      printf("First letter of name should be an alphabet (A-Z or a-z)\n"); 
      getchar(); 
      goto start; 
     } 
     } 
    } while (flag == 0); 

    getchar(); 
    return 0; 
} 
+4

是一個天使,直到你已經編程10000小時不使用goto語句。 – Bathsheba

+0

閱讀每個使用功能的文檔,例如[scanf的](http://man7.org/linux/man-pages/man3/scanf.3.html)。編譯所有警告和調試信息('gcc -Wall -Wextra -g')。使用調試器('gdb')。您的代碼不可移植到具有非ASCII字符編碼的系統(例如EBCDIC) –

+0

鑑於您是Stackoverflow的新手,請閱讀[問]。 – dandan78

回答

2

數組的第一個元素的索引爲0更改爲:

(name[0] >= 65 && name[0] <= 90 || name[0] >= 97 && name[0] <= 122) 

而且它本來,如果你使用的字符litterals更具可讀性,更改爲:

(name[0] >= 'A' && name[0] <= 'Z' || name[0] >= 'a' && name[0] <= 'z') 

還存在一個isalpha功能,可以使你的測試...

也不要把你的測試內循環,你說你只想測試第一個字母,所以爲什麼循環?這應該看起來像(也消除gotofflush,不必要getchar,並添加括號來幫助閱讀條件):

do { 
    printf("input name[1..30 chars]: "); 
    scanf("%s", name); 
    if ((name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z')) { 
     flag = 1; 
    } 
    else { 
     printf("First letter of name should be an alphabet (A-Z or a-z)\n"); 
    } 
} while (flag == 0); 
+0

感謝alott man!你能教我如何使用isalpha嗎?我希望在編程時我能和你一樣好! – AlbertusFar

+0

在提出這樣的問題之前,請嘗試閱讀手冊或教程。 'isalpha(名字[0])'應該這樣做。 –

+0

@AlbertusFar - 希望你的問題解決。請接受答案! :) – GNKeshava

1

數組的第一個字符開始於索引0,不1。所以,你需要將其更改爲:

if (name[0] >= 65 && name[0] <= 90 || name[0] >= 97 && name[0] <= 122) { 

    } 

您可以使用isalpha()這是更簡單,便於攜帶。

注意fflush(stdin);不確定的行爲在ISO C.

1
if (name[1] >= 65 && name[1] <= 90 || name[1] >= 97 && name[1] <= 122) { 
     flag = 1; 
    } 

name[1]將檢查第二個字符不是第一次。數組索引開始於0029在您的案例),因此第一個字符是name[0]

一點 - 而不是計算循環內的字符串長度,首先計算它,存儲到變量,然後在條件中使用它。

注意 - 當您使用do-while循環時,爲什麼甚至使用goto。循環將以任何方式重複(ofcourse,直到flag不是1)。沒有必要。