gpt4 book ai didi

c - 使用指针和字符串——一个字符如何变成一个整数?

转载 作者:行者123 更新时间:2023-12-04 10:17:03 25 4
gpt4 key购买 nike

我正在练习指针,试图熟悉 C 语言中指针的来龙去脉。我搜索了教程,但没有找到直接回答我的问题的答案。这是我拼凑的一些代码,可以证明我的问题。这只是将字符指针 *s1 设置为长字符串,将指针 s2 设置为两个字母的字符串。嵌套循环遍历长字符串以查找与短字符串的匹配项。但是,我不明白指针中存储的信息。如果我使用 % 格式 %d,指针会给我一个整数,如果我使用 %c,我会得到我想要的字母。但是,带有 if (*(s1+j)!=*(s2+k)) 的行似乎依赖于指针是一个整数并添加到它进行比较。我的理解是指针只是指向一个可以找到这个字符串的内存地址。如果我向内存地址添加一个数字,它如何在字符串中移动?它不会指向一个新的内存地址吗?这是我正在使用的代码:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {

int count, total;
int n1,n2,i,j,k;
char *s1 = "vrrecgcrer";
char *s2 = "re";

n1=strlen(s1)-1;
n2=strlen(s2);

printf("n1: %d, n2: %d\n",n1,n2);
for (i = 0; i <= (n1-n2); i++){
count=0;
for(j = i,k = 0; k < n2; j++,k++){
printf("j is %d -- k is %d -- 1st %c -- 2nd %d\n", j, k, *(s1+j), *(s2+k));
if (*(s1+j)!=*(s2+k)){
break;
}
else
count++;
if(count==n2)
{
total++;
}
}
}

printf("The number of substrings is: %d\n", total);

return 0;
} /* MAIN */

最佳答案

这个if语句中的表达式

if (*(s1+j)!=*(s2+k)){

相当于

if ( s1[j] != s2[k] ){

所以这里比较了两个 char 类型的对象隐式转换为类型 int由于当运算符 != 时应用于操作数的整数提升规则被使用。

来自 C 标准(6.5.2.1 数组下标)

2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

在这个声明中

printf("j is %d -- k is %d -- 1st %c -- 2nd %d\n", j, k, *(s1+j), *(s2+k));
^^^

表达式*(s2+k)类型为 char转换为类型 int由于默认参数提升

来自 C 标准(6.5.2.2 函数调用)

7 ... The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments.

参见函数声明printf

int printf(const char * restrict format, ...);
^^^

至于你的整个程序是不正确的。

例如变量total未初始化。

这个for循环的条件

for (i = 0; i <= (n1-n2); i++){ 

错了。让我们假设这两个字符串具有相同的大小。在这种情况下,循环将永远不会执行。

关于c - 使用指针和字符串——一个字符如何变成一个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44766887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com