-5

我是一个喜欢玩编码的新人。最近我正在学习 edx 的课程,我需要完成的一个练习有这个小代码片段,它不断给出分段错误。我已经取出了错误的部分(其他一切都编译得很好)

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

int main (int argc, string argv[])
{
    if (argc == 2 && isalpha(argv[1]))
    {
        int a = 0;

        while (argv[1][a] == '\0')
        {
            a++;
            printf("%c\n", argv[1][a]);
        }
    }
    else
    {
        printf("Usage: ./programname 1-alphabetical word\n");
        return 1;
    }
}

问题似乎就在这里:argv[1][a]但我无法终生找出是什么以及如何解决它。

4

3 回答 3

0

isalpha(argv[1])看起来不正确,应该是isalpha(argv[1][0])

isalpha 接受一个字符,但您在函数中输入了一个字符串

argv[1][a] == '\0'另一件错误的事情是== 应该是!=这将意味着 while 循环一旦碰到\0

也许

if (argc == 2)
{
    int a = 0;

    while (argv[1][a] != '\0')
    {
                if (isalpha(argv[1][a])
                    printf("%c\n", argv[1][a]);
                a++;
    }
}

可能是你在找什么?

于 2017-07-28T12:14:51.453 回答
0

(1)isalpha(argv[1])错误。此函数需要一个字符,但您传递的是指向字符串的指针。这肯定不会给您任何预期的结果,而且它可能是讨价还价的未定义行为。您需要循环并检查每个字符,使用更高级的库函数来检查整个字符串,或者 - 作为一种快速且可能改变意义的修复 - 只需按照 BLUEPIXY 的建议检查第一个字符:isalpha( argv[1][0] )isalpha( *argv[0] ).

(2) 你的while条件不对。您是在告诉它当前字符为NUL. 这对非空字符串没有任何作用,并针对空字符串命中下一个问题#3。您大概的意思是while (argv[1][a] != '\0'),即仅循环直到NUL到达一个字节。

a(3)在尝试之前增加索引printf()。如果输入字符串为空,这将立即超出范围索引,因为主体执行,然后您立即索引超出 terminating NUL。即使循环条件已修复,您也会错过第一个字符,然后打印 terminating NUL,这两者都没有意义。a只有在您确认它在范围内并完成您需要做的事情后,您才应该增加。所以,printf()它,然后增加它。

通过使用for循环而不是手动拆分循环变量的初始化、测试和递增,似乎最容易解决 2 和 3 的问题。您还应该使用正确的类型进行索引:如果您想打印具有数百万或数十亿个字符的字符串,int则 an 不够宽,而且它的样式不好。所以:

#include <stddef.h> /* size_t */

for (size_t a = 0; argv[1][a] != '\0'; ++a) {
    printf("%c\n", argv[1][a]);
}
于 2017-07-28T12:27:02.047 回答
0

我看到的分段错误的唯一原因是 if 语句的这个子表达式

if (argc == 2 && isalpha(argv[1]))
                 ^^^^^^^^^^^^^^^^ 

指定了不正确类型的参数。表达式argv[1] 具有类型char *,而函数需要一个字符类型的对象,该对象被解释为unsigned char并提升为类型int

因此,当提升的参数具有负值(EOF 值除外)时,该函数isalpha 具有未定义的行为。

来自 C 标准(7.4 字符处理<ctype.h>

1 标题<ctype.h>声明了几个对字符分类和映射有用的函数。198) 在所有情况下,参数都是一个 int,其值应表示为无符号字符或应等于宏 EOF 的值。如果参数有任何其他值,则行为未定义。

您应该像这样编写 if 语句

if (argc == 2 && isalpha( ( unsigned char )argv[1][0] ) )

或喜欢

if (argc == 2 && isalpha( ( unsigned char )*argv[1] ) )

while 语句中还有一个错误,如果参数不是空字符串,则永远不会执行。我想你的意思是以下

    int a = 0;

    while ( argv[1][a] != '\0' )
    {
        printf("%c\n", argv[1][a]);
        a++;
    }

或者例如像

    int a = 0;

    while ( argv[1][a] )
    {
        printf("%c\n", argv[1][a++]);
    }
于 2017-07-28T12:39:40.537 回答