这种在64位系统中取字符串一部分的方法合法吗?
Is this method of taking part of a string in a 64-bit system legal?
此代码评估来自网络服务器的响应。在这里,我们假设响应只有两行。一行显示网页状态,另一行显示另一个随机 HTTP 条目且没有 HTML 代码。在我的代码中,buf(又名缓冲区)将包含此数据。然后我使用 strchr 找到换行符,但它 returns 是一个指针。
然后我将缓冲区指针和指向匹配字符串数据的指针相减,得到绝对结果。我想要绝对结果的原因是因为我需要一个正数才能将缓冲区的第一部分正确复制到新缓冲区。
这种将两个 char 指针相减并获得结果作为绝对值的方法对于 64 位系统是否合法,还是我必须进行额外的计算?我问的原因是因为在 64 位系统上,一些数据元素的大小不同,我想如果我不小心,我可能会在 strncpy 甚至第三个参数的计算中导致分段错误在 strncpy.
#include <stdio.h>
#include <string.h>
int main() {
char buf[500] = "HTTP/1.1 200 OK\nsomething: something";
char* p = strchr(buf, '\n');
if (p) {
char news[500];
memset(news, 0, 500);
strncpy(news, buf, abs(p - buf));
printf("%s\n", news);
} else {
printf("Can't read line!\n");
}
}
你所做的(减去指针)是完全合法的。唯一的问题是使用 strncpy,您复制的字符串不会以 null 结尾。 strncpy 的通常用途是避免缓冲区溢出,但在特定情况下您想要复制字符串的一部分。您将需要添加空终止符:
strncpy(news, buf, p - buf);
*(news + (p - buf)) = '[=10=]';
此代码评估来自网络服务器的响应。在这里,我们假设响应只有两行。一行显示网页状态,另一行显示另一个随机 HTTP 条目且没有 HTML 代码。在我的代码中,buf(又名缓冲区)将包含此数据。然后我使用 strchr 找到换行符,但它 returns 是一个指针。
然后我将缓冲区指针和指向匹配字符串数据的指针相减,得到绝对结果。我想要绝对结果的原因是因为我需要一个正数才能将缓冲区的第一部分正确复制到新缓冲区。
这种将两个 char 指针相减并获得结果作为绝对值的方法对于 64 位系统是否合法,还是我必须进行额外的计算?我问的原因是因为在 64 位系统上,一些数据元素的大小不同,我想如果我不小心,我可能会在 strncpy 甚至第三个参数的计算中导致分段错误在 strncpy.
#include <stdio.h>
#include <string.h>
int main() {
char buf[500] = "HTTP/1.1 200 OK\nsomething: something";
char* p = strchr(buf, '\n');
if (p) {
char news[500];
memset(news, 0, 500);
strncpy(news, buf, abs(p - buf));
printf("%s\n", news);
} else {
printf("Can't read line!\n");
}
}
你所做的(减去指针)是完全合法的。唯一的问题是使用 strncpy,您复制的字符串不会以 null 结尾。 strncpy 的通常用途是避免缓冲区溢出,但在特定情况下您想要复制字符串的一部分。您将需要添加空终止符:
strncpy(news, buf, p - buf);
*(news + (p - buf)) = '[=10=]';