我正在执行一个将字符串中的所有空格替换为"%20"的方法。人们可以假设字符串末尾有足够的空间来容纳附加字符,并且给定字符串的"真实"长度。
例:
输入:"约翰·史密斯先生",13
输出:"Mr%20John%20Smith">
#include <stdio.h>
#include <string.h>
void URL(char str[], int length)
{
int spacecount = 0, index;
for (int i = 0; i < length; i++)
{
if (str[i] == ' ')
{
spacecount++;
}
}
index = length + spacecount * 2;
if (length < strlen(str))
str[length] = ' ';
for (int j = length - 1; j >= 0; j--)
{
if (str[j] == ' ')
{
str[index - 1] = '0';
str[index - 2] = '2';
str[index - 3] = '%';
index = index - 3;
}
else
{
str[index - 1] = str[j];
index--;
}
}
printf("%s", str);
}
int main()
{
char str[100];
int len;
printf("Enter the string : ");
scanf("%s", str);
printf("Enter the length : ");
scanf("%d", &len);
URL(str, len);
}
在使用 gcc 编译器执行上述代码时,我遇到了分段错误。我明白,什么是分段错误。我想在这个程序中修复它。
如何
scanf("%s", str);
工作?
如果您的输入是:Mr John Smith
,str
将包含的内容
它没有按照你想的那样做!答案是它将包含Mr
,因此您没有长度为 13 的字符串。
请改用fgets
但请记住删除换行符。
完整的程序可以是:
#include <stdio.h>
#include <string.h>
void URL(char str[], int length)
{
printf("input: |%s|n", str);
int spacecount = 0, index;
for (int i = 0; i < length; i++)
{
if (str[i] == ' ')
{
spacecount++;
}
}
index = length + spacecount * 2;
str[index] = ' ';
for (int j = length - 1; j >= 0; j--)
{
if (str[j] == ' ')
{
str[index - 1] = '0';
str[index - 2] = '2';
str[index - 3] = '%';
index = index - 3;
}
else
{
str[index - 1] = str[j];
index--;
}
}
printf("output: |%s|n", str);
}
int main()
{
char str[100];
int len;
printf("Enter the string : ");
fgets(str, 100, stdin);
len = strlen(str);
if (len > 0 && str[len-1] == 'n') str[--len] = ' ';
URL(str, len);
}
输入:
Mr John Smith
注意:史密斯之后有 5 个额外的空格
输出:
input: |Mr John Smith |
output: |Mr%20John%20Smith%20%20%20%20%20|
除了使用 @4386427 建议的fgets
之外,您还可以将scanf
与说明符一起使用%[^n]
(匹配任何不是n
的内容(来读取整行,如下所示:
scanf(" %[^n]", str);
为了安全起见,在处理字符串时,您应该始终限制可以读取的字符数,使其不超过数组str
的长度,方法是执行以下操作:
scanf(" %99[^n]", str);
因此,您的main
可能是:
int main()
{
char str[100];
int len;
printf("Enter the string : ");
scanf(" %99[^n]", str);
for (int c=getchar(); c!='n' && c!=EOF; c=getchar());
len = strlen(str);
URL(str, len);
}