【问题标题】:char string manipulation in CC中的字符字符串操作
【发布时间】:2012-02-03 19:10:43
【问题描述】:

想弄清楚这一点,我的脑袋越来越乱。

任务是从用户那里获取一行文本,然后将其反向打印出来,包括每个字符的十六进制代码。

我认为它会很简单,一旦我了解了用法,可能就是这样。

我的想法是,我将使用 char stg_array[80] 设置我的变量,这将使我的最大大小为 80 个字符。

然后我会做一个

while( (stg_array[i] = getch() ) != '\n' )
{
    i++;
}

然后我会使用strlen() 来确定实际长度(我意识到我已经有了它,只是想使用strlen() 进行练习)并进入一个for 循环,该循环将从strlen(stg_array)-1 倒计时和

printf("Array[%d] = %s Hex Value = %X", i, stg_array[i], i );

我了解如果用户键入的字符数超过 80 个,我可能会遇到缓冲区溢出错误。现在不担心这个。

我得到的是strlen() 将长度返回到文本中的第一个空格。

如果我跳过用户输入,只在中间使用固定的for 循环创建char stg_array[80]={"The quick brown fox."},比如10,程序就会崩溃。

我想我要出去吃午饭,了解 C 字符串数组的功能。

【问题讨论】:

  • 为了将来参考,请使用{ } 按钮而不是粗体显示代码。
  • 要回应@Marlon,请花点时间read about Stack Overflow's formatting syntax。
  • 我看到你用单引号初始化 stg_array[80] 。这是一个字符串文字,你需要用双引号来做。 char stg_array[80]={"The quick brown fox."} 这可能就是你这样做时它会崩溃的原因。
  • 问题在于 printf 中的 %s...您传递的是 char 而不是 char *

标签: c string


【解决方案1】:

希望以下内容有所帮助!

#include <stdio.h>

#define MAX 80

int main(void)
{
    char stg_array[MAX];
    int i = 0, j;
    int len;

    printf("Enter String : ");
    while((i < MAX-1) && ((stg_array[i] = getchar()) != '\n')) {
        i++;
    }
    stg_array[i] = '\0';

    for (j=i ; j>=0 ; j--) {
        printf("stg_array[%d] = %c / %x \n", j, stg_array[j], stg_array[j]);
    }

    return 0;
}

输出:

Enter String : this is a test string
stg_array[21] =  / 0 
stg_array[20] = g / 67 
stg_array[19] = n / 6e 
stg_array[18] = i / 69 
stg_array[17] = r / 72 
stg_array[16] = t / 74 
stg_array[15] = s / 73 
stg_array[14] =   / 20 
stg_array[13] = t / 74 
stg_array[12] = s / 73 
stg_array[11] = e / 65 
stg_array[10] = t / 74 
stg_array[9] =   / 20 
stg_array[8] = a / 61 
stg_array[7] =   / 20 
stg_array[6] = s / 73 
stg_array[5] = i / 69 
stg_array[4] =   / 20 
stg_array[3] = s / 73 
stg_array[2] = i / 69 
stg_array[1] = h / 68 
stg_array[0] = t / 74 

【讨论】:

  • 与我所拥有的非常相似,但我没有在字符串末尾添加 \0。由于字符串需要以 \0 终止,这会导致问题吗?
  • @ChefFlambe 是的,这是一回事。缓冲区溢出是另一个。所以我在while循环中添加了一个检查。
【解决方案2】:

您需要修复您作为 printf 的 %X 的参数提供的内容,然后您不应该使用 char stg_array[80]={'The quick brown fox.'}(这甚至不应该编译,给您一个“单个字符常量对于它的类型来说太长”错误)但 char *stg_array="The quick brown fox." 代替(我将 char[80] 替换为 char* 因为它更正确,但如果您愿意,可以保留您的)。

如果 strlen() 返回一个值,它总是正确的。 strlen() 永远不会返回字符串中第一个空格的索引,如果你认为它会返回,那么你做错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多