[英]C language: change user input
我需要編寫從用戶那里獲取Input
程序,以防萬一我已經quate
( "
),我需要將quotes
內的所有chars
更改為uppercase
。
int main()
{
int quoteflag = 0;
int ch = 0;
int i = 0;
char str[127] = { '\0' };
while ((ch = getchar()) != EOF && !isdigit(ch))
{
++i;
if (ch == '"')
quoteflag = !quoteflag;
if (quoteflag == 0)
str[i] = tolower(ch);
else
{
strncat(str, &ch, 1);
while ((ch = getchar()) != '\"')
{
char c = toupper(ch);
strncat(str, &c, 1);
}
strncat(str, &ch, 1);
quoteflag = !quoteflag;
}
if (ch == '.')
{
strncat(str, &ch, 1);
addnewline(str);
addnewline(str);
}
else
{
if ((isupper(ch) && !quoteflag))
{
char c = tolower(ch);
strncat(str, &c, 1);
}
}
}
printf("\n-----------------------------");
printf("\nYour output:\n%s", str);
getchar();
return 1;
}
void addnewline(char *c)
{
char tmp[1] = { '\n' };
strncat(c, tmp, 1);
}
所以我的問題是,如果我的輸入是"a"
此打印在末尾"A
而不是"A"
,我不知道為什么
問題是您正在以奇怪的方式使用strncat
。 首先, strncat
在big-endian系統上永遠不會做任何事情。 strncat
作用是將輸入...讀取為字符串 。 因此,將int
(四個或八個字節)傳遞給該函數,它將讀取第一個字節。 如果第一個字節為0
,則它將認為它是字符串的結尾,並且不會對str添加任何內容。 在小端系統上,第一個字節應該是您想要的char
,但是在大端系統上,它應該是高字節(對於一個int
,該值小於255的值將始終為零)。 您可以在此處閱讀有關字節序的更多信息 。
不過,我不知道為什么要使用strncat
附加單個字符。 您使用str[i] = tolower(ch)
有了正確的主意。 我將int ch
更改為char ch
,然后經過檢查,並在代碼中將strncat(...)
替換為str[i++] = ...
,它編譯良好並返回了所需的"A"
輸出。 源代碼如下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int quoteflag = 0;
char ch = 0;
int i = 0;
char str[127] = { '\0' };
while ((ch = getchar()) != EOF && !isdigit(ch))
{
if (ch == '"')
quoteflag = !quoteflag;
if (quoteflag == 0)
str[i++] = tolower(ch);
else
{
str[i++] = ch;
while ((ch = getchar()) != '\"')
{
char c = toupper(ch);
str[i++] = c;
}
str[i++] = ch;
quoteflag = !quoteflag;
}
if (ch == '.')
{
str[i++] = '.';
str[i++] = '\n';
str[i++] = '\n';
}
else
{
if ((isupper(ch) && !quoteflag))
{
char c = tolower(ch);
str[i++] = c;
}
}
}
printf("\n-----------------------------");
printf("\nYour output:\n%s", str);
getchar();
return 1;
}
您應該刪除++i;
行,然后更改:
str[i] = tolower(ch);
至:
str[i++] = tolower(ch);
否則,由於您是預遞增的,因此,如果您的第一個字符不是"
而是說a
,則您的字符串將為\\0a\\0\\0...
這將導致我們a
下一個問題:
strncat(str, &ch, 1);
如果輸入是a"
,則strncat(str, &'"', 1);
將給出\\"\\0\\0...
的結果,因為strncat
會將str
視為空字符串。將所有出現的內容替換為上面的內容:
str[i++] = toupper(ch);
(當您傳入格式錯誤的字符串時, strncat()
在技術上也可能是未定義的行為,但對於語言律師而言,這就是一種)
這將跟蹤索引,否則一旦退出報價循環,您的第一個str[i] = tolower(ch);
將開始覆蓋引號中的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.