2013-12-12 66 views
0

新蜂C.這是我的代碼(它從一個字符串替換字符):scanf函數,沒有開關的情況下執行

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

void main() 
{ 
    char str[100], r, ra; 
    printf("enter string"); 
    gets(str); 
    int length; 
    length= strlen(str); 
    printf("length of string is %d",length); 
    printf("\nenter the the character that will replace"); 
    scanf("%c",&r); 
    printf("where to replace\n b...begning\ne....ending\np....position"); 
    scanf("%c",&ra); 
    int pos; 
    switch(ra) 
    { 
    case 'b' : str[1]=r; break; 
    case 'e' : str[length-1] = r; break; 
    case 'p' : printf("enter position"); 
       scanf("%d",pos); 
       if(pos<1 || pos>length-1) 
        printf("please enter a position between 1 and %d",length-1); 
       else 
        str[pos]= r; 
       break; 
    } 
    printf("\n after replacing string is %s", str); 
    getche(); 

} 

的問題是,IDE不編譯這部分程序,我知道我正在做一些錯誤的事情,但無法弄清楚什麼?需要幫助。

scanf("%c",&ra); 
    int pos; 
    switch(ra) 
    { 
    case 'b' : str[1]=r; break; 
    case 'e' : str[length-1] = r; break; 
    case 'p' : printf("enter position"); 
       scanf("%d",pos); 
       if(pos<1 || pos>length-1) 
        printf("please enter a position between 1 and %d",length-1); 
       else 
        str[pos]= r; 
       break; 
    } 
+2

「IDE不編譯這部分程序」:你是什麼意思?它給出了一個錯誤消息?還有別的嗎?請與我們分享。 –

+1

我猜你正在使用Visual Studio,是否正確?不要使用'gets()',這很危險。改用'fgets()'。 –

+1

懷疑編譯器「不編譯」你的程序的一部分不是很有效率。這當然不是你所觀察到的。您發現程序不會執行您編程的任何情況。有一個簡單的方法可以知道執行的地方,在那裏:添加一個'default'事件,並在那個時候打印出'ra'中的內容。 –

回答

3

使用scanf(" %c",&ra) insted "%c"。因爲與"%c"一起閱讀給你一個垃圾值ra。並且該值爲新行。

當您在a中輸入值時,按下類似p然後Enter key。此Enter key仍保留在stdin流中。

當您在ra中讀取下一次的時候,stdin中的Enter key流將返回ra

因此,要刪除該Enter key你需要閱讀像" %c"

+0

是的,但OP的問題是程序還沒有編譯。他可以在編譯和運行後遇到這個問題。 –

2

scanf(" %c", &ra); //%c之前的空間
與大多數轉換不同,%c在轉換字符之前不會跳過空格。用戶輸入號碼後,輸入緩衝區中會有一個回車/換行符等待讀取 - 這就是%c讀取的內容。SO POST

而出於同樣的原因,您的開關盒不是工作,因爲ra沒有預期的價值

0

該程序不編譯,最可能的原因是,您使用的編譯器只支持C89(我猜是Visual Studio),或者您正在使用C89模式。

在此代碼:

scanf("%c",&ra); 
int pos; 
switch(ra) 
{ 

可變pos在方框,這僅因爲C99被支撐的中間定義。解決的辦法是將所有定義到一個塊的開頭:

int main() 
{ 
    char str[100], r, ra; 
    int pos; 
    printf("enter string"); 

使用fgets()更換gets(),使用int main更換void main。並使用其他答案涵蓋的scanf修復問題。

1

的問題是IDE未編譯程序

嗯,這是一個強烈指責這一部分。與其假設編譯器確實不會編譯部分代碼(一時興起),更確切的說,您的程序的執行流程並不像您期望的那樣進入該部分。

特別是,scanf不像您認爲的那樣行事。它從stdin中讀取,這是一個緩衝輸入流。 「緩衝」意味着它不會爲你的程序提供輸入,直到讀入新行,即直到用戶按下返回。但scanf系列函數不尋找新行,它將新行字符視爲普通字符。在你的情況下,掃描"%c"嘗試從輸入中讀取任何字符。隨後"%c"然後讀取新行,因此您的switch語句中的&ra確實是'\n'

我通常會發現C語言的用戶很難直接輸入,但是如果您必須以交互方式提示用戶,我建議您首先用fgets讀入一整行輸入,然後用sscanf分析該行。這可以擺脫看起來不同步的輸入,並且還可以讓您多次掃描一條線,也許可以用於替代輸入語法。

所以,這裏是一個使用這種技術代碼的版本:

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

int main() 
{ 
    char str[100], r, ra; 
    char line[20]; 
    int length; 
    int pos; 

    printf("enter string"); 
    fgets(str, 100, stdin); // note: str includes trailing newline 

    length = strlen(str); 

    printf("length of string is %d\n", length); 
    printf("enter the the character that will replace:\n"); 
    fgets(line, 20, stdin); 
    sscanf(line, " %c ",&r); 

    printf("where to replace\n"); 
    printf("b...begning\ne....ending\np....position\n"); 
    fgets(line, 20, stdin); 
    sscanf(line, " %c ", &ra); 

    switch (ra) 
    { 
    case 'b': str[1] = r; 
       break; 

    case 'e': str[length - 1] = r; 
       break; 

    case 'p': printf("enter position"); 
       fgets(line, 20, stdin); 
       sscanf(line, "%d ", &pos); 

       if(pos < 1 || pos > length-1) 
        printf("please enter a position between 1 and %d", 
         length-1); 
       else 
        str[pos]= r; break; 
    } 

    printf("after replacing string is %s", str); 

    return 0; 
} 

還有你的代碼的問題,主要與C.從零開始的數組索引做我讓你來把這些弄清楚。另外,寧願fgets(buf, len, stdin)而不是gets(str),這不會阻止緩衝區溢出。而且您對一個頭寸的查詢應該指向pos的地址,而不僅僅是pos。請習慣於將新行字符放在您的printf字符串中。它使得閱讀更清晰,並且與緩衝輸出流的工作方式相匹配。

相關問題