[英]C : trying to remove spaces from a string without using any string library functions
[英]Attach a String to another String in C WITHOUT any spaces
這是我在該論壇上的第一篇文章,所以請耐心等待。
我需要做一個簡短的編程,用戶可以輸入2個字符串,然后再附加。 我已經在下面獲得了此代碼(不允許使用其他“包含”)。
我需要知道的是:如何拒絕用戶輸入的任何空格?
示例:1.字符串“ Hello” | 2.字符串“世界”
結果應該是“ HelloWorld”而不是“ Hello World”。
#include <stdio.h>
void main()
{
char eingabe1[100];
char eingabe2[100];
int i = 0;
int j = 0;
printf("Gib zwei Wörter ein, die aneinander angehängt werden sollen\n");
printf("1. Zeichenkette: ");
gets(eingabe1);
printf("\n");
printf("2. Zeichenkette: ");
gets(eingabe2);
printf("\n");
while (eingabe1[i] != '\0')
{
i++;
}
while (eingabe2[j] != '\0')
{
eingabe1[i++] = eingabe2[j++];
}
eingabe1[i] = '\0';
printf("Nach Verketten: ");
puts(eingabe1);
}
復制字符串時,必須過濾掉空格。
您有兩個字符串索引, i
表示第一個字符串, j
表示第二個字符串。 如果將i
用作讀取位置(隨后是兩個字符串);可以將j
用作寫入位置,則可以更好地利用這些索引。
這是如何做。 請注意,該代碼僅在字符串中有空格的情況下嘗試通過添加字符來防止緩沖區溢出。 僅在復制第二個字符串時才需要執行此檢查,因為在處理第一個字符串時j <= i
。
#include <stdio.h>
int main()
{
char str1[100] = "The quick brown fox jumps over ";
char str2[100] = "my big sphinx of quartz";
int i = 0;
int j = 0;
while (str1[i] != '\0') {
if (str1[i] != ' ') str1[j++] = str1[i];
i++;
}
i = 0;
while (str2[i] != '\0') {
if (str2[i] != ' ' && j + 1 < sizeof(str1)) str1[j++] = str2[i];
i++;
}
str1[j] = '\0';
printf("'%s'\n", str1);
return 0;
}
除了避免兩個單詞之間有空格外 ,還必須避免用戶按Enter鍵將換行符 ( '\\n'
)放在輸入緩沖區中。 在使用fgets()
NOT gets()
閱讀該行之后,可以通過簡單的測試來做到這一點。 gets()
不再是標准C庫的一部分,並且由於不安全原因,不應使用。 plus fgets
提供了對用戶可以隨時輸入的字符數的簡單長度控制。
在下面,當您閱讀eingabe1
時遇到麻煩。 讀取后, eingabe1
在其末尾包含一個'\\n'
字符。 (就像使用任何面向行的輸入函數一樣(例如getline()
, fgets()
等) fgets()
,要處理換行符,您可以在循環遍歷字符串以找到nul之后,簡單地比較其長度減去'1'
字符,例如:
if (eingabe1[i-1] == '\n') i--; /* remove trailing '\n', update i */
通過簡單地減少索引'i'
,這將確保與eingabe2
的串聯在單詞之間不會有任何空格或換行符 。
將各個部分放在一起,並使用fgets
代替不安全的gets
,在#define MAX 100
了一個常量以防止對數組索引進行硬編碼之后,您可能會想到類似以下內容:
#include <stdio.h>
#define MAX 100
int main (void)
{
char eingabe1[MAX] = {0};
char eingabe2[MAX] = {0};
int i = 0;
int j = 0;
printf("Gib zwei Wörter ein, die aneinander angehängt werden sollen\n");
printf("1. Zeichenkette: ");
/* do NOT use gets - it is no longer part of the C library */
fgets(eingabe1, MAX, stdin);
putchar ('\n');
printf("2. Zeichenkette: ");
/* do NOT use gets - it is no longer part of the C library */
fgets(eingabe2, MAX, stdin);
putchar ('\n');
while (eingabe1[i]) i++; /* set i (index) to terminating nul */
if (i > 0) {
if (eingabe1[i-1] == '\n') i--; /* remove trailing '\n' */
while (i && eingabe1[i-1] == ' ') /* remove trailing ' ' */
i--;
}
while (eingabe2[j]) { /* concatenate string - no spaces */
eingabe1[i++] = eingabe2[j++];
}
eingabe1[i] = 0; /* nul-terminate eingabe1 */
printf("Nach Verketten: %s\n", eingabe1);
return 0;
}
輸出量
$ ./bin/strcatsimple
Gib zwei Wörter ein, die aneinander angehängt werden sollen
1. Zeichenkette: Lars
2. Zeichenkette: Kenitsche
Nach Verketten: LarsKenitsche
如果您還有其他問題,請告訴我。 我在上面的評論中強調了這些變化。
/**
return: the new len of the string;
*/
int removeChar(char* string, char c) {
int i, j;
int len = strlen(string)+1; // +1 to include '\0'
for(i = 0, j = 0 ; i < len ; i++){
if( string[i] == c )
continue; // avoid incrementing j and copying c
string[ j ] = string[ i ]; // shift characters
j++;
}
return j-1; // do not count '\0';
}
int main(){
char str1[] = "sky is flat ";
char str2[100] = "earth is small ";
strcat( str2, str1 );
printf("with spaces:\n\t'%s'\n", str2) ;
removeChar(str2, ' ');
printf("without spaces:\n\t'%s'\n", str2 );
}
/**
BONUS: this will remove many characters at once, eg "\n \r\t"
return: the new len of the string;
*/
int removeChars(char* string, char *chars) {
int i, j;
int len = strlen(string);
for(i = 0, j = 0 ; i < len ; i++){
if( strchr(chars,string[i]) )
continue; // avoid incrementing j and copying c
string[ j ] = string[ i ]; // shift characters
j++;
}
string[ j ]=0;
return j;
}
謝謝大家的所有答案。 我現在有了解決方案。
我從您那里讀到一些建議,並會為未來牢記。
請參見下面的代碼:(請給我輸入變量的奇怪名稱,我使用德語單詞)
幾點注意事項:不允許我使用庫函數由於某些原因,我不允許使用fgets
#include <stdio.h>
void main()
{
char eingabe1[100];
char eingabe2[100];
int i = 0;
int j = 0;
printf("gib zwei wörter ein, die aneinander angehängt werden sollen\n");
printf("1. zeichenkette: ");
gets(eingabe1);
printf("\n");
printf("2. zeichenkette: ");
gets(eingabe2);
printf("\n");
//Attach Strings
while (eingabe1[i] != '\0')
{
i++;
}
while (eingabe2[j] != '\0')
{
eingabe1[i++] = eingabe2[j++];
}
//Remove Space
eingabe1[i] = '\0';
i = 0;
j = 0;
while (eingabe1[i] != '\0')
{
if (eingabe1[i] != 32)
{
eingabe2[j++] = eingabe1[i];
}
i++;
}
eingabe2[j] = '\0';
printf("Nach verketten: ");
puts(eingabe2);
}
對我來說聽起來像是功課。
我只是想提一提,這些天您可能不應該在字符串上使用sizeof(),因為其中可能存在多字節字符。 請改用strlen()。 sizeof()唯一合適的時間是,如果您要向malloc()傳輸一定數量的字節來存儲它。
我經常編寫一些小循環來一次編寫低級文本,每次只處理一個字符,只是要知道C中的字符串通常以0字節結尾。 您必須期望遇到一個,並確保將一個放在輸出中。 空格是0x20或十進制32或'',它只是另一個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.