strcpy (p, p+1) 做什么(p 是一个字符数组)?
What does strcpy (p, p+1) do (being p an array of chars)?
尽管我知道 strcpy 的作用,但我无法理解它在这种特定情况下的作用。我在哪里看到它说它将字符串 p 复制一个字符回来,但我不完全理解为什么来源是 p + 1。
我看到它的代码在这里:
#include <stdio.h>
#include <string.h>
#define MAXLINE 100000
int mgetline(char s[], int maxline);
int removetrail(char p[], int length);
int main(void){
int len, lenr;
char line[MAXLINE];
while ((len = mgetline(line, MAXLINE)) > 0){
if ((lenr = removetrail(line, len)) > 0)
printf("%s", line);
}
return 0;
}
int mgetline(char s[], int maxline)
{
int i, c;
for (i = 0;(i < maxline) && ((c = getchar()) != EOF);++i){
if (c == '\n'){
s[i] = c;
break;
}
else
s[i] = c;
}
++i;
s[i] = '[=10=]';
return i;
}
int removetrail(char p[], int length)
{
int a;
for (a = 0 ; ((p[a] == '\t') || (p[a] == ' ')) && a < length ; length--)
strcpy(p, p+1);
for (a = length - 2 ; ((p[a] == '\t') || (p[a] == ' ')) && a > 0 ; --a)
;
if ((p[a] != ' ') && (p[a] != '\t') && (a >= 0)){
++a;
p[a] = '\n';
++a;
p[a] = '[=10=]';
}
return a;
}
可能该代码的作者希望删除字符串的第一个字符。但这是一个 错误的 代码,因为源代码和目标代码不能重叠。
另一个问题是字符串长度是否为 0。
正确版本:
char *removeFirst(char *str)
{
char *wrk = str;
if(str && *str)
{
do
{
*str = *(str +1);
}
while(*str++);
}
return wrk;
}
char *ostrcpy(char *dest, const char *src)
{
size_t len = strlen(src);
memmove(dest, src, len + 1);
return dest;
}
int main()
{
char str[] = "hello";
printf("%s\n", removeFirst(str));
printf("%s\n", ostrcpy(str, str+1));
}
尽管我知道 strcpy 的作用,但我无法理解它在这种特定情况下的作用。我在哪里看到它说它将字符串 p 复制一个字符回来,但我不完全理解为什么来源是 p + 1。 我看到它的代码在这里:
#include <stdio.h>
#include <string.h>
#define MAXLINE 100000
int mgetline(char s[], int maxline);
int removetrail(char p[], int length);
int main(void){
int len, lenr;
char line[MAXLINE];
while ((len = mgetline(line, MAXLINE)) > 0){
if ((lenr = removetrail(line, len)) > 0)
printf("%s", line);
}
return 0;
}
int mgetline(char s[], int maxline)
{
int i, c;
for (i = 0;(i < maxline) && ((c = getchar()) != EOF);++i){
if (c == '\n'){
s[i] = c;
break;
}
else
s[i] = c;
}
++i;
s[i] = '[=10=]';
return i;
}
int removetrail(char p[], int length)
{
int a;
for (a = 0 ; ((p[a] == '\t') || (p[a] == ' ')) && a < length ; length--)
strcpy(p, p+1);
for (a = length - 2 ; ((p[a] == '\t') || (p[a] == ' ')) && a > 0 ; --a)
;
if ((p[a] != ' ') && (p[a] != '\t') && (a >= 0)){
++a;
p[a] = '\n';
++a;
p[a] = '[=10=]';
}
return a;
}
可能该代码的作者希望删除字符串的第一个字符。但这是一个 错误的 代码,因为源代码和目标代码不能重叠。
另一个问题是字符串长度是否为 0。
正确版本:
char *removeFirst(char *str)
{
char *wrk = str;
if(str && *str)
{
do
{
*str = *(str +1);
}
while(*str++);
}
return wrk;
}
char *ostrcpy(char *dest, const char *src)
{
size_t len = strlen(src);
memmove(dest, src, len + 1);
return dest;
}
int main()
{
char str[] = "hello";
printf("%s\n", removeFirst(str));
printf("%s\n", ostrcpy(str, str+1));
}