我在嘗試解決 C 中的特定問題時遇到了一個問題。用戶輸入必須以加密形式讀取,輸出必須是解密的訊息,也就是說,它是一個替換密碼。問題是當我閱讀第一個輸入,程式回圈列印解密的訊息,它不要求讀取其他輸入。
我對此感到非常困惑,因為有人告訴我應該使用 EOF,我對此不太了解。我什至可以用另一種方式解決它,但我需要實作 EOF,因為我不知道,所以我很難解決這個練習。
我知道我創建的代碼不是最適合解決問題的代碼,但是,如果有人幫助我解決此回圈問題,它可能會起作用。
源代碼
#include <stdio.h>
#include <string.h>
void alterChar(int i, char phrase[])
{
for (i = 0; phrase[i] != '\0'; i )
{
if (phrase[i] == '@')
{
phrase[i] = 'a';
}
if (phrase[i] == '&')
{
phrase[i] = 'e';
}
if (phrase[i] == '!')
{
phrase[i] = 'i';
}
if (phrase[i] == '*')
{
phrase[i] = 'o';
}
if (phrase[i] == '#')
{
phrase[i] = 'u';
}
printf("%s\n", phrase);
}
}
int main()
{
int i;
char phrase[256];
while (scanf("%[^\n]s", phrase) != EOF)
{
///scanf(" %[^\n]s", phrase);
alterChar(i, phrase);
}
return 0;
}
uj5u.com熱心網友回復:
線
while (scanf("%[^\n]s", phrase) != EOF)
是錯誤的,有幾個原因:
您似乎尚未決定是使用
%s還是%[]轉換格式說明符。該字符s不是%[]格式說明符的一部分。因此,在使用您的格式字串時,scanf將嘗試匹配文字s. 這可能不是您想要的,因此應該從格式字串中洗掉它。如果
scanf因為該行為空而無法匹配任何字符,它將回傳0并且不會觸及phrase. 但是,您錯誤地將 的回傳值0視為成功。如果用戶輸入超過 255 個字符,那么您將
phrase越界寫入陣列,從而導致未定義的行為(即您的程式可能會崩潰)。因此,您應該將匹配的字符數限制為 255 個字符,以便函式不會寫入超過 256 個字符(包括字串的終止空字符)。
由于上述原因,您應該將該行更改為以下內容:
while ( scanf( "%5[^\n]", phrase ) != 1 )
此外,此scanf陳述句不會使用輸入流中的換行符,因此下一個函式呼叫scanf將失敗。因此,您必須呼叫一個函式來使用輸入流中的換行符,例如通過呼叫getchar,或通過告訴 scanf 預先使用所有空白輸入,如下所示:
while ( scanf( " %5[^\n]", phrase ) != 1 )
或者,您可以改用該函式fgets(我推薦),因為該函式還將使用換行符并將其寫入字串。
while ( fgets( phrase, sizeof phrase, stdin ) != NULL )
使用函式時fgets,您還應該驗證是否讀入了整行,例如通過在之后撰寫以下代碼:
//verify that entire line was read in
if ( strchr( phrase, '\n' ) == NULL )
{
printf( "line to long for input buffer!\n" );
exit( EXIT_FAILURE );
}
請注意,如果您決定使用該函式fgets,則行尾將有一個額外的換行符,而不僅僅是 a '\0',因此在該函式中alterChar,您必須更改該行
for (i = 0; phrase[i] != '\0'; i )
到
for (i = 0; phrase[i] != '\n'; i )
您的代碼中的另一個問題是該行
alterChar(i, phrase);
沒有意義。您正在將未初始化的變數的值傳遞給函式。
您可能應該將函式原型從
void alterChar(int i, char phrase[])
到
void alterChar( char phrase[] )
也可能給函式一個更好的名字,因為它不處理單個字符,而是整個字串,并且還列印它:
void alterAndPrintPhrase( char phrase[] )
此外,在該功能中,您應該移動該行
printf("%s\n", phrase);
在回圈之外。
應用上述所有修復后,您的代碼應如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void alterAndPrintPhrase( char phrase[] )
{
for ( int i = 0; phrase[i] != '\n'; i )
{
if (phrase[i] == '@')
{
phrase[i] = 'a';
}
if (phrase[i] == '&')
{
phrase[i] = 'e';
}
if (phrase[i] == '!')
{
phrase[i] = 'i';
}
if (phrase[i] == '*')
{
phrase[i] = 'o';
}
if (phrase[i] == '#')
{
phrase[i] = 'u';
}
}
printf( "%s\n", phrase );
}
int main()
{
char phrase[256];
while ( fgets( phrase, sizeof phrase, stdin ) != NULL )
{
//verify that entire line was read in
if ( strchr( phrase, '\n' ) == NULL )
{
printf( "line to long for input buffer!\n" );
exit( EXIT_FAILURE );
}
alterAndPrintPhrase( phrase );
}
return 0;
}
該程式具有以下行為:
輸入:
Th!s !s @ t&st.
輸出:
This is a test.
uj5u.com熱心網友回復:
我認為只需將 printf 放在回圈幫助之外并使用feof(fetch en of file) 來了解您的位置。
#include <stdio.h>
#include <string.h>
void alterChar(char phrase[]) {
for (int i = 0; phrase[i] != '\0'; i ) {
if (phrase[i] == '@') {
phrase[i] = 'a';
}
if (phrase[i] == '&') {
phrase[i] = 'e';
}
if (phrase[i] == '!') {
phrase[i] = 'i';
}
if (phrase[i] == '*') {
phrase[i] = 'o';
}
if (phrase[i] == '#') {
phrase[i] = 'u';
}
}
printf("%s\n", phrase);
}
int main() {
char phrase[256];
while (!feof(stdin)) {
scanf(" %[^\n]s", phrase);
alterChar(phrase);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379865.html
標籤:C
上一篇:C和SDL如何在螢屏上移動一個點
下一篇:在陣列中宣告結構型別的元素
