这是我在这个论坛的第一篇文章,所以请耐心等待。
我需要制作一个简短的程序,用户可以输入2个字符串,之后应该附加。 我已经在下面得到了这个代码(我不允许使用其他"包含")。
我需要知道的是:我如何否认用户将进入的任何空格?
示例:1。String" Hello" | 2. String" World"
结果应该是" 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);
}
答案 0 :(得分:1)
您必须在复制字符串时过滤掉空格。
您有两个字符串索引,第一个字符串为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;
}
答案 1 :(得分:1)
除了避免两个单词之间的空格之外,您还必须避免用户在输入缓冲区中放置换行符('\n'
)字符按输入。在阅读fgets()
NOT gets()
后的行后,您可以通过简单的测试完成此操作。 gets()
不再是标准C库的一部分,由于不安全原因,不应使用它。 Plus fgets
提供了对用户可以随时输入的字符数的简单长度控制。
下面,当您阅读eingabe1
时遇到麻烦。阅读完毕后,eingabe1
在其末尾包含'\n'
个字符。 (因为它会使用任何面向行的输入函数(例如getline()
,fgets()
等)来处理换行符,你可以简单地比较它的长度减去{{ 1}}在你遍历字符串后找到 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;
}
如果您有任何其他问题,请与我们联系。我已通过上述评论突出显示了这些变化。
答案 2 :(得分:0)
/**
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;
}
答案 3 :(得分:0)
感谢大家的所有答案。 我现在得到了解决方案。
我从你那里读到了一些建议,并会努力记住未来。
请参阅以下代码: (请原谅我对变量的奇怪名称,我使用德语单词)
一些通知: 我不被允许使用库函数 作为实习生,我不允许出于某些原因使用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);
}
答案 4 :(得分:0)
听起来像是家庭作业。
我只想提一下,这些天你可能不应该在字符串上使用sizeof(),因为那里可能有多字节字符。请改用strlen()。 sizeof()唯一合适的时间是你要去malloc()一定数量的字节来存储它。
我经常写一些小循环来做一次一个字符的低级文本,只要知道C中的字符串通常最后有一个0字节。你必须要遇到一个,并确保你在输出上放一个。空格为0x20或十进制32或&#39; &#39;,它只是另一个角色。